日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
刪除C++容器值相關(guān)技巧講解

在程序開發(fā)的過(guò)程中,C++編程語(yǔ)言中的容器里有會(huì)有很多值,有些是比較有用的,而有些是沒(méi)用的。那么對(duì)于這些沒(méi)有用的值我們應(yīng)該如何進(jìn)行刪除呢?在這里我們將會(huì)為大家詳細(xì)介紹刪除C++容器值的相關(guān)方法。

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

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

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

上述代碼在刪除一個(gè)元素的時(shí)候并沒(méi)有問(wèn)題。。。但是我們想刪除所有大于10的值,于是:

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

滿懷希望的編譯,運(yùn)行。。。于是異常發(fā)生。。。啊。。。哦。。。

原來(lái)是刪除迭代器i后,i所指的元素已經(jīng)失效了,然后給i++,它已經(jīng)不在存在了。。。于是絞盡腦汁,出籠了下面的刪除C++容器值代碼:

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

上面的代碼很容易理解,即在刪除一個(gè)迭代器之前,把它的之后的迭代器先存儲(chǔ),然后在下次循環(huán)的時(shí)候利用之前存儲(chǔ)的迭代器。

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

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

嗯。。。高手就是高手(我以前根本沒(méi)有在意過(guò)++i和i++在使用的過(guò)程中能有這么大的區(qū)別)好了,***再提供一個(gè)版本,利用list的remove_if函數(shù)。

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

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


分享題目:刪除C++容器值相關(guān)技巧講解
轉(zhuǎn)載來(lái)源:http://www.dlmjj.cn/article/djosehj.html