程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 刪除C++容器值相關技巧講解

刪除C++容器值相關技巧講解

編輯:C++入門知識

在程序開發的過程中,C++編程語言中的容器裡有會有很多值,有些是比較有用的,而有些是沒用的。那麼對於這些沒有用的值我們應該如何進行刪除呢?在這裡我們將會為大家詳細介紹刪除C++容器值的相關方法。

C++的容器中一般都提供erase函數,此函數接收的參數一般有一個是一個迭代器:

如果刪除C++容器值的話,我們可能一般都用過:

  1. list<int> c;  
  2. // todo insert items  
  3. for (list<int>::iterator i = c.begin(); i!= c.end(); ++i)  
  4. {  
  5. if ((*i)>10)  
  6. {  
  7. // 如果有一個值大於10,刪除之  
  8. c.erase(i);  
  9. break;  
  10. }  

上述代碼在刪除一個元素的時候並沒有問題。。。但是我們想刪除所有大於10的值,於是:

  1. list<int> c;  
  2. // todo insert items  
  3. for (list<int>::iterator i = c.begin(); i!= c.end(); ++i)  
  4. {  
  5. if ((*i)>10)  
  6. {  
  7. // 刪除所有大於10的值  
  8. c.erase(i);  
  9. }  

滿懷希望的編譯,運行。。。於是異常發生。。。啊。。。哦。。。

原來是刪除迭代器i後,i所指的元素已經失效了,然後給i++,它已經不在存在了。。。於是絞盡腦汁,出籠了下面的刪除C++容器值代碼:

  1. list<int> c;  
  2. // todo insert items  
  3. list<int>::iterator nextitr = c.begin();  
  4. for (list<int>::iterator i = c.begin();;)  
  5. {  
  6. if(nextitr == c.end())  
  7. break;  
  8. ++nextitr;  
  9. if ((*i)>10)  
  10. {  
  11. // 如果有一個值大於10,刪除之  
  12. c.erase(i);  
  13. }  
  14. i = nextitr;  

上面的代碼很容易理解,即在刪除一個迭代器之前,把它的之後的迭代器先存儲,然後在下次循環的時候利用之前存儲的迭代器。

OK,我們看到上面這段代碼可以工作了,行為似乎也還正確,只是。。。代碼似乎多了點。我想代碼能夠少點就好了,邏輯也不要那麼麻煩。那麼我們看下面的代碼轉載自Effective STL)。

  1. list<int> c;  
  2. // todo insert items  
  3. for (list<int>::iterator i = c.begin(); i!= c.end();)  
  4. {  
  5. if ((*i)>10)  
  6. {  
  7. // 如果有一個值大於10,刪除之  
  8. c.erase(i++);  
  9. }  
  10. else  
  11. i++;  

嗯。。。高手就是高手我以前根本沒有在意過++i和i++在使用的過程中能有這麼大的區別)好了,最後再提供一個版本,利用list的remove_if函數。

  1. bool fun(int i)  
  2. {  
  3. if(i>10)  
  4. return true;  
  5. else  
  6. return false;  
  7. }  
  8. list<int> c;  
  9. // todo insert items  
  10. c.remove_if(fun); 

嗯,其實刪除C++容器值的方式還是挺多的。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved