刪除C++容器值相關(guān)技巧講解
作者:佚名 
  刪除C++容器值的實(shí)現(xiàn)方法還是比較多的,我們今天為大家介紹的就是其中一個比較常用的,簡單的實(shí)現(xiàn)方法,希望能給大家?guī)硪恍椭?/div>  
 
                           
  在程序開發(fā)的過程中,C++編程語言中的容器里有會有很多值,有些是比較有用的,而有些是沒用的。那么對于這些沒有用的值我們應(yīng)該如何進(jìn)行刪除呢?在這里我們將會為大家詳細(xì)介紹刪除C++容器值的相關(guān)方法。
C++的容器中一般都提供erase函數(shù),此函數(shù)接收的參數(shù)一般有一個是一個迭代器:
如果刪除C++容器值的話,我們可能一般都用過:
- list<int> c;
 - // todo insert items
 - for (list<int>::iterator i = c.begin(); i!= c.end(); ++i)
 - {
 - if ((*i)>10)
 - {
 - // 如果有一個值大于10,刪除之
 - c.erase(i);
 - break;
 - }
 - }
 
上述代碼在刪除一個元素的時候并沒有問題。。。但是我們想刪除所有大于10的值,于是:
- list<int> c;
 - // todo insert items
 - for (list<int>::iterator i = c.begin(); i!= c.end(); ++i)
 - {
 - if ((*i)>10)
 - {
 - // 刪除所有大于10的值
 - c.erase(i);
 - }
 - }
 
滿懷希望的編譯,運(yùn)行。。。于是異常發(fā)生。。。啊。。。哦。。。
原來是刪除迭代器i后,i所指的元素已經(jīng)失效了,然后給i++,它已經(jīng)不在存在了。。。于是絞盡腦汁,出籠了下面的刪除C++容器值代碼:
- list<int> c;
 - // todo insert items
 - list<int>::iterator nextitr = c.begin();
 - for (list<int>::iterator i = c.begin();;)
 - {
 - if(nextitr == c.end())
 - break;
 - ++nextitr;
 - if ((*i)>10)
 - {
 - // 如果有一個值大于10,刪除之
 - c.erase(i);
 - }
 - i = nextitr;
 - }
 
上面的代碼很容易理解,即在刪除一個迭代器之前,把它的之后的迭代器先存儲,然后在下次循環(huán)的時候利用之前存儲的迭代器。
OK,我們看到上面這段代碼可以工作了,行為似乎也還正確,只是。。。代碼似乎多了點(diǎn)。我想代碼能夠少點(diǎn)就好了,邏輯也不要那么麻煩。那么我們看下面的代碼(轉(zhuǎn)載自Effective STL)。
- list<int> c;
 - // todo insert items
 - for (list<int>::iterator i = c.begin(); i!= c.end();)
 - {
 - if ((*i)>10)
 - {
 - // 如果有一個值大于10,刪除之
 - c.erase(i++);
 - }
 - else
 - i++;
 - }
 
嗯。。。高手就是高手(我以前根本沒有在意過++i和i++在使用的過程中能有這么大的區(qū)別)好了,***再提供一個版本,利用list的remove_if函數(shù)。
- bool fun(int i)
 - {
 - if(i>10)
 - return true;
 - else
 - return false;
 - }
 - list<int> c;
 - // todo insert items
 - c.remove_if(fun);
 
嗯,其實(shí)刪除C++容器值的方式還是挺多的。
【編輯推薦】
責(zé)任編輯:曹凱 
                    來源:
                    博客園
  
 
相關(guān)推薦
 2011-07-10 15:26:54
 
 
 














 
 
 