在程序開發的過程中,C++編程語言中的容器裡有會有很多值,有些是比較有用的,而有些是沒用的。那麼對於這些沒有用的值我們應該如何進行刪除呢?在這裡我們將會為大家詳細介紹刪除C++容器值的相關方法。
C++的容器中一般都提供erase函數,此函數接收的參數一般有一個是一個迭代器:
如果刪除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);
- }
- }
滿懷希望的編譯,運行。。。於是異常發生。。。啊。。。哦。。。
原來是刪除迭代器i後,i所指的元素已經失效了,然後給i++,它已經不在存在了。。。於是絞盡腦汁,出籠了下面的刪除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;
- }
上面的代碼很容易理解,即在刪除一個迭代器之前,把它的之後的迭代器先存儲,然後在下次循環的時候利用之前存儲的迭代器。
OK,我們看到上面這段代碼可以工作了,行為似乎也還正確,只是。。。代碼似乎多了點。我想代碼能夠少點就好了,邏輯也不要那麼麻煩。那麼我們看下面的代碼轉載自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++在使用的過程中能有這麼大的區別)好了,最後再提供一個版本,利用list的remove_if函數。
- bool fun(int i)
- {
- if(i>10)
- return true;
- else
- return false;
- }
- list<int> c;
- // todo insert items
- c.remove_if(fun);
嗯,其實刪除C++容器值的方式還是挺多的。