青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

STL中用erase()方法遍歷刪除元素

Posted on 2008-12-27 00:23 Herbert 閱讀(45143) 評(píng)論(10)  編輯 收藏 引用 所屬分類: C++
      STL中的容器按存儲(chǔ)方式分為兩類,一類是按以數(shù)組形式存儲(chǔ)的容器(如:vector 、deque);另一類是以不連續(xù)的節(jié)點(diǎn)形式存儲(chǔ)的容器(如:list、set、map)。在使用erase方法來刪除元素時(shí),需要注意一些問題。
      在使用 list、set 或 map遍歷刪除某些元素時(shí)可以這樣使用:

正確使用方法1      std::list< int> List;
      std::list< int>::iterator itList;
      for( itList = List.begin(); itList != List.end(); )
      {
            if( WillDelete( *itList) )
            {
               itList = List.erase( itList);
            }
            else
               itList++;
      }

       或

正確使用方法2      std::list< int> List;
      std::list< int>::iterator itList;
      for( itList = List.begin(); itList != List.end(); )
      {
            if( WillDelete( *itList) )
            {
               List.erase( itList++);
            }
            else
               itList++;
      }

      
      下面是兩個(gè)錯(cuò)誤的使用方法:

錯(cuò)誤使用方法1      std::list< int> List;
      std::list< int>::iterator itList;
      for( itList = List.begin(); itList != List.end(); itList++)
      {
            if( WillDelete( *itList) )
            {
               List.erase( itList);
            }
      }

         或
錯(cuò)誤使用方法2      std::list< int> List;
      std::list< int>::iterator itList;
      for( itList = List.begin(); itList != List.end(); )
      {
            if( WillDelete( *itList) )
            {
               itList = List.erase( ++itList);
            }
            else
               itList++;
      }

      正確使用方法1:通過erase方法的返回值來獲取下一個(gè)元素的位置
      正確使用方法2:在調(diào)用erase方法之前先使用 “++”來獲取下一個(gè)元素的位置
      錯(cuò)誤使用方法1:在調(diào)用erase方法之后使用“++”來獲取下一個(gè)元素的位置,由于在調(diào)用erase方法以后,該元素的位置已經(jīng)被刪除,如果在根據(jù)這個(gè)舊的位置來獲取下一個(gè)位置,則會(huì)出現(xiàn)異常。
      錯(cuò)誤使用方法2:同上。

      這里“++”運(yùn)算符與我們平常的理解剛好相反,erase( itList++) 是先獲取下一個(gè)元素的位置在刪除; erase( ++itList) 是刪除以后再獲取下一個(gè)元素的位置。

     在使用 vector、deque遍歷刪除元素時(shí),也可以通過erase的返回值來獲取下一個(gè)元素的位置:
正確使用方法      std::vector< int> Vec;
      std::vector< int>::iterator itVec;
      for( itVec = Vec.begin(); itVec != Vec.end(); )
      {
            if( WillDelete( *itVec) )
            {
                 itVec = Vec.erase( itVec);
            }
            else
               itList++;
      }
      
      注意:vector、deque 不能像上面的“正確使用方法2”的辦法來遍歷刪除。

Feedback

# re: STL中用erase()方法遍歷刪除元素(更簡(jiǎn)單的用法)  回復(fù)  更多評(píng)論   

2009-01-08 08:34 by canaan
http://zhgn.vicp.net/boke/200901071529.htm

# re: STL中用erase()方法遍歷刪除元素  回復(fù)  更多評(píng)論   

2009-01-09 11:03 by Herbert
多謝cannan提點(diǎn),不過用你提供的更簡(jiǎn)單的用法似乎還是有點(diǎn)漏洞,舉個(gè)例子:
假如有一個(gè)列表 ShipList,里面的內(nèi)容是0、1、2、3...9, 如果要從中刪除那些取余3后為0或?yàn)?的數(shù),刪除后應(yīng)該得出的結(jié)果是 2、5、8。
但如果是這樣操作:
std::<int >::iterator it;
for( it = ShipList.begin(); it != ShipList.end(); it++)
{
if( (*it) % 3 == 0 || (*it) % 3 == 1)
ShipList.erase( it++);
}
這樣的話會(huì)有兩個(gè)問題,一個(gè)是得出的結(jié)果是 1、2、4、5、7、8(沒有刪除取余3后等于1的數(shù));另外一個(gè)問題是當(dāng)執(zhí)行到列表中最后一個(gè)元素(即ShipList.end() - 1 )時(shí),迭代器可能還會(huì)執(zhí)行兩次“++”,如果是這樣那么it就到達(dá)了 ShipList.end() + 1 的位置,這樣也會(huì)報(bào)錯(cuò)。

# re: STL中用erase()方法遍歷刪除元素  回復(fù)  更多評(píng)論   

2009-01-15 11:30 by 無名劍
你的第二種方法在VS03下是正確的,但在05或08下會(huì)出問題,因?yàn)榈魇Я?,還是遵循C++標(biāo)準(zhǔn)比較好

# re: STL中用erase()方法遍歷刪除元素  回復(fù)  更多評(píng)論   

2009-01-15 18:23 by Herbert
@無名劍
是嗎?VS其它版本我沒測(cè)試過,不過在VS08運(yùn)行是沒問題的喔...

# re: STL中用erase()方法遍歷刪除元素  回復(fù)  更多評(píng)論   

2009-05-30 13:08 by xu
這里“++”運(yùn)算符與我們平常的理解剛好相反,erase( itList++) 是先獲取下一個(gè)元素的位置在刪除; erase( ++itList) 是刪除以后再獲取下一個(gè)元素的位置。
為什么會(huì)這樣呢?我好像沒看到這方面的資料,有這方面的說明嗎?

# re: STL中用erase()方法遍歷刪除元素  回復(fù)  更多評(píng)論   

2009-08-05 12:15 by xxt
轉(zhuǎn)到我的空間,謝謝:)
http://blog.c114.net/html/87/367587-50926.html

# re: STL中用erase()方法遍歷刪除元素  回復(fù)  更多評(píng)論   

2010-03-20 11:53 by kidst
erase( itList++) 是先獲取下一個(gè)元素的位置再刪除; erase( ++itList) 是刪除以后再獲取下一個(gè)元素的位置。
我覺得不應(yīng)該這樣理解。
我認(rèn)為,erase(itList++)是itList先傳遞值給erase(),然后再自增;
erase(++itList)是先自增,然后再把自增后的值傳遞給erase(),這個(gè)是出錯(cuò)的根源。

# re: STL中用erase()方法遍歷刪除元素  回復(fù)  更多評(píng)論   

2011-02-24 14:28 by ami
謝謝了

# re: STL中用erase()方法遍歷刪除元素[未登錄]  回復(fù)  更多評(píng)論   

2011-04-19 11:01 by daniel
1.
2010-03-20 11:53 by kidst
erase( itList++) 是先獲取下一個(gè)元素的位置再刪除; erase( ++itList) 是刪除以后再獲取下一個(gè)元素的位置。
我覺得不應(yīng)該這樣理解。
我認(rèn)為,erase(itList++)是itList先傳遞值給erase(),然后再自增;
erase(++itList)是先自增,然后再把自增后的值傳遞給erase(),這個(gè)是出錯(cuò)的根源。
----同意kidst上述觀點(diǎn)

2.
2009-01-09 11:03 by Herbert
多謝cannan提點(diǎn),不過用你提供的更簡(jiǎn)單的用法似乎還是有點(diǎn)漏洞,舉個(gè)例子:
假如有一個(gè)列表 ShipList,里面的內(nèi)容是0、1、2、3...9, 如果要從中刪除那些取余3后為0或?yàn)?的數(shù),刪除后應(yīng)該得出的結(jié)果是 2、5、8。
但如果是這樣操作:
std::<int >::iterator it;
for( it = ShipList.begin(); it != ShipList.end(); it++)
{
if( (*it) % 3 == 0 || (*it) % 3 == 1)
ShipList.erase( it++);
}
這樣的話會(huì)有兩個(gè)問題,一個(gè)是得出的結(jié)果是 1、2、4、5、7、8(沒有刪除取余3后等于1的數(shù));另外一個(gè)問題是當(dāng)執(zhí)行到列表中最后一個(gè)元素(即ShipList.end() - 1 )時(shí),迭代器可能還會(huì)執(zhí)行兩次“++”,如果是這樣那么it就到達(dá)了 ShipList.end() + 1 的位置,這樣也會(huì)報(bào)錯(cuò)。
----出錯(cuò)是因?yàn)樵趂or循環(huán)中多了一次自增操作,這樣,在余0之后,自增了兩次,當(dāng)然就把余1的數(shù)漏掉了

# re: STL中用erase()方法遍歷刪除元素  回復(fù)  更多評(píng)論   

2011-08-31 17:54 by Siryang
明顯有個(gè)問題, A B C D
刪除了B之后,itEnd指向D+1
再刪除D,itEnd指向D+2,it不移動(dòng),還指向D,D是個(gè)錯(cuò)誤的指針。
如果不報(bào)錯(cuò)就是死循環(huán)。否則程序就崩...
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            一区二区欧美国产| 久久综合中文色婷婷| 久久精品国产2020观看福利| 99精品视频免费| 亚洲国产欧美国产综合一区| 国内精品视频在线播放| 国产一区二区精品久久| 黄色日韩精品| 亚洲久色影视| 午夜亚洲影视| 免费欧美电影| 亚洲裸体在线观看| 亚洲欧美在线播放| 麻豆国产精品va在线观看不卡| 欧美91大片| 国产精品国内视频| 亚洲综合不卡| 另类图片国产| 国产九九视频一区二区三区| 极品中文字幕一区| 制服丝袜激情欧洲亚洲| 久久国产精品毛片| 亚洲黄色性网站| 欧美亚洲一级片| 欧美另类高清视频在线| 国产亚洲成年网址在线观看| 亚洲乱码国产乱码精品精天堂| 午夜精品久久久久久99热| 麻豆91精品| 亚洲性图久久| 欧美日韩国产123| 亚洲国产精品高清久久久| 性感少妇一区| 日韩午夜在线视频| 免费在线日韩av| 精品69视频一区二区三区| 亚洲男女自偷自拍| 亚洲精品一区二区三区av| 久久久久网站| 好吊妞这里只有精品| 先锋影音国产一区| 亚洲免费激情| 欧美精品二区| 亚洲国产视频一区| 久久中文精品| 亚洲欧美怡红院| 国产精品天美传媒入口| 99香蕉国产精品偷在线观看| 欧美1区免费| 欧美一区二区成人| 国产精品久久| 亚洲欧美日韩国产成人| 亚洲精品网站在线播放gif| 欧美1区3d| 亚洲乱码久久| 亚洲免费电影在线| 欧美日韩国产精品专区| 日韩亚洲在线观看| 91久久综合| 欧美精品久久久久久| 亚洲美女中出| 亚洲精品久久久久久久久久久| 欧美本精品男人aⅴ天堂| 亚洲国产精品精华液2区45| 美日韩在线观看| 美女国产一区| 日韩一级在线观看| 99一区二区| 国产精品久久久久久久浪潮网站| 亚洲综合社区| 欧美一区二区三区免费在线看| 国产欧美丝祙| 女同性一区二区三区人了人一| 久久久99免费视频| 亚洲日韩欧美一区二区在线| 亚洲精选91| 欧美在线播放高清精品| 国产一区二区三区四区在线观看| 久久久久久97三级| 久久资源在线| 亚洲视频免费看| 亚洲欧美日韩另类| 精品999网站| 亚洲精品乱码| 国产欧美韩国高清| 欧美激情按摩| 欧美日韩视频在线一区二区观看视频| 亚洲视频久久| 欧美亚洲一区在线| 亚洲精品久久久久中文字幕欢迎你 | 日韩视频专区| 国产女人18毛片水18精品| 老色鬼久久亚洲一区二区| 男人的天堂亚洲| 亚洲欧美综合一区| 久久综合狠狠| 亚洲专区免费| 免费成年人欧美视频| 亚洲欧美视频在线观看| 蜜臀av性久久久久蜜臀aⅴ四虎| 亚洲自拍偷拍视频| 欧美a级片网站| 久久精品一区二区三区四区 | 欧美老女人xx| 久久人人爽国产| 国产精品hd| 亚洲精品1区2区| 韩国av一区二区三区| 国产精品99久久久久久www| 亚洲国产99| 性做久久久久久久免费看| 在线视频一区观看| 免费看精品久久片| 久久影视精品| 国产日韩亚洲欧美精品| 亚洲精品视频一区| 亚洲欧洲在线免费| 久久青草久久| 亚洲人成人99网站| 国产中文一区二区| 中文av字幕一区| 99精品欧美一区| 美日韩精品视频| 麻豆91精品91久久久的内涵| 国产人成精品一区二区三| 一区二区三区国产在线观看| 亚洲精选91| 欧美不卡一区| 亚洲第一搞黄网站| 91久久视频| 欧美黑人一区二区三区| 亚洲国产精品成人va在线观看| 亚洲一区免费看| 这里只有精品电影| 欧美日韩一区二区三区在线 | 欧美中文字幕视频在线观看| 亚洲欧美日韩一区二区三区在线| 欧美成人三级在线| 91久久久亚洲精品| 日韩视频在线一区| 欧美日韩国产一区二区三区地区 | 亚洲一区二区三区成人在线视频精品 | 亚洲破处大片| 欧美激情精品久久久久久变态| 欧美风情在线| 宅男在线国产精品| 国产女主播在线一区二区| 午夜亚洲性色福利视频| 久久久久九九视频| 亚洲福利专区| 欧美日韩免费在线| 亚洲欧美日本视频在线观看| 久久精品一区二区三区中文字幕| 国产一区二区三区精品欧美日韩一区二区三区| 午夜亚洲伦理| 欧美激情中文字幕乱码免费| 亚洲六月丁香色婷婷综合久久| 欧美日韩在线播放一区二区| 亚洲一区二区精品在线| 久久精品国产在热久久 | 欧美高清免费| 一区二区高清在线| 久久久久国产精品人| 亚洲东热激情| 欧美调教视频| 久久久亚洲精品一区二区三区| 欧美成人免费在线视频| 亚洲少妇自拍| 激情久久婷婷| 欧美日韩日日夜夜| 久久成人精品视频| 亚洲日产国产精品| 久久久久久久久久久一区| 日韩视频在线永久播放| 国产情人节一区| 欧美激情视频一区二区三区在线播放 | 亚洲第一伊人| 国产精品久久久久久久一区探花| 久久成人精品一区二区三区| 亚洲人被黑人高潮完整版| 欧美一级在线播放| 亚洲精品国产精品乱码不99| 国产精品va| 欧美第一黄网免费网站| 性娇小13――14欧美| 亚洲国产日韩一级| 免费不卡中文字幕视频| 午夜精品免费在线| 日韩午夜黄色| 浪潮色综合久久天堂| 亚洲午夜精品网| 亚洲国产精品一区在线观看不卡 | 亚洲黄色在线观看| 国产日韩欧美一区| 国产精品美女在线观看| 欧美精品久久久久a| 久久综合一区二区三区| 久久激情久久| 欧美一区二区三区视频免费播放 | 另类酷文…触手系列精品集v1小说|