重慶分公司,新征程啟航
為企業提供網站建設、域名注冊、服務器等服務
為企業提供網站建設、域名注冊、服務器等服務
這期內容當中小編將會給大家帶來有關刪除C++容器值相關方法是怎么樣的,文章內容豐富且以專業的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
我們提供的服務有:成都做網站、網站建設、微信公眾號開發、網站優化、網站認證、旌陽ssl等。為千余家企事業單位解決了網站和推廣的問題。提供周到的售前咨詢和貼心的售后服務,是有科學管理、有技術的旌陽網站制作公司
在程序開發的過程中,C++編程語言中的容器里有會有很多值,有些是比較有用的,而有些是沒用的。那么對于這些沒有用的值我們應該如何進行刪除呢?在這里我們將會為大家詳細介紹刪除C++容器值的相關方法。
C++的容器中一般都提供erase函數,此函數接收的參數一般有一個是一個迭代器:
如果刪除C++容器值的話,我們可能一般都用過:
listc; // todo insert items for (list ::iterator i = c.begin(); i!= c.end(); ++i) { if ((*i)>10) { // 如果有一個值大于10,刪除之 c.erase(i); break; } }
上述代碼在刪除一個元素的時候并沒有問題。。。但是我們想刪除所有大于10的值,于是:
listc; // todo insert items for (list ::iterator i = c.begin(); i!= c.end(); ++i) { if ((*i)>10) { // 刪除所有大于10的值 c.erase(i); } }
滿懷希望的編譯,運行。。。于是異常發生。。。啊。。。哦。。。
原來是刪除迭代器i后,i所指的元素已經失效了,然后給i++,它已經不在存在了。。。于是絞盡腦汁,出籠了下面的刪除C++容器值代碼:
listc; // todo insert items list ::iterator nextitr = c.begin(); for (list ::iterator i = c.begin();;) { if(nextitr == c.end()) break; ++nextitr; if ((*i)>10) { // 如果有一個值大于10,刪除之 c.erase(i); } i = nextitr; }
上面的代碼很容易理解,即在刪除一個迭代器之前,把它的之后的迭代器先存儲,然后在下次循環的時候利用之前存儲的迭代器。
OK,我們看到上面這段代碼可以工作了,行為似乎也還正確,只是。。。代碼似乎多了點。我想代碼能夠少點就好了,邏輯也不要那么麻煩。那么我們看下面的代碼(轉載自Effective STL)。
listc; // todo insert items for (list ::iterator i = c.begin(); i!= c.end();) { if ((*i)>10) { // 如果有一個值大于10,刪除之 c.erase(i++); } else i++; }
嗯。。。高手就是高手(我以前根本沒有在意過++i和i++在使用的過程中能有這么大的區別)好了,***再提供一個版本,利用list的remove_if函數。
bool fun(int i) { if(i>10) return true; else return false; } listc; // todo insert items c.remove_if(fun);
嗯,其實刪除C++容器值的方式還是挺多的。
上述就是小編為大家分享的刪除C++容器值相關方法是怎么樣的了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注創新互聯行業資訊頻道。