C++迭代器失效

今個(gè)試了下vector的插入和刪除操作:

C++提供的函數(shù)

vector插入和刪除
push_back(ele); --尾部插入元素ele
pop_back(); --刪除最后一個(gè)元素
insert(const_iterator pos, ele); --迭代器指向位置pos插入元素ele
insert(const_iterator pos, int count, ele); -- 迭代器指向位置pos插入count個(gè)元素ele
erase(const_iterator pos); --刪除迭代器指向的元素
erase(const_iterator start, const_iterator end);-- 刪除迭代器從start到end之間的元素
clear(); --刪除容器中所有元素

使用insert()出現(xiàn)異常的代碼

    vector<int> v;

    //尾插法
    v.push_back(10);
    v.push_back(20);
    v.push_back(30);
    v.push_back(40);
    v.push_back(50);

    disp(v);

    //尾刪法
    v.pop_back();
    disp(v);

    //插入函數(shù)
    vector<int>::iterator it = v.begin();
    v.insert(it++, 10000);
    //++it;
    cout << *it << endl;
    disp(v);

運(yùn)行

運(yùn)行時(shí)異常

然而如若注掉insert()纤勒、直接輸出這個(gè)解出來(lái)的迭代器卻不會(huì)發(fā)生異常妥畏,且這個(gè)異常的提示顯示的是nullptr,說(shuō)明我定義的這個(gè)迭代器已經(jīng)失效了藕届,這個(gè)指針運(yùn)行完insert就被置空了彼棍。

一臉蒙蔽荠商,Google癣丧、問(wèn)大佬,一頓操作之后:
才知道骤视,迭代器也會(huì)失效鞍爱,因?yàn)槲以谶M(jìn)行insert之后,這個(gè)序列式容器已經(jīng)發(fā)生了改變专酗,對(duì)于序列式容器(如vector,deque)睹逃,序列式容器就是數(shù)組式容器,刪除****插入等改變當(dāng)前的iterator會(huì)使后面所有元素的iterator失效笼裳,這是因?yàn)関etor,deque使用了連續(xù)分配的內(nèi)存唯卖,刪除一個(gè)元素導(dǎo)致后面所有的元素會(huì)向前移動(dòng)一個(gè)位置粱玲。所以不能使用insert(++it躬柬,10000)的方式

總結(jié):迭代器失效分三種情況考慮,也是非三種數(shù)據(jù)結(jié)構(gòu)考慮抽减,分別為數(shù)組型允青,鏈表型,樹(shù)型數(shù)據(jù)結(jié)構(gòu)卵沉。

數(shù)組型數(shù)據(jù)結(jié)構(gòu):該數(shù)據(jù)結(jié)構(gòu)的元素是分配在連續(xù)的內(nèi)存中颠锉,insert和erase操作法牲,都會(huì)使得刪除點(diǎn)和插入點(diǎn)之后的元素挪位置,所以琼掠,插入點(diǎn)和刪除掉之后的迭代器全部失效拒垃,也就是說(shuō)insert(iter)(或erase(iter)),然后在iter++瓷蛙,是沒(méi)有意義的悼瓮。解決方法:erase(*iter)的返回值是下一個(gè)有效迭代器的值。 iter =cont.erase(iter);

鏈表型數(shù)據(jù)結(jié)構(gòu):對(duì)于list型的數(shù)據(jù)結(jié)構(gòu)艰猬,使用了不連續(xù)分配的內(nèi)存横堡,刪除運(yùn)算使指向刪除位置的迭代器失效,但是不會(huì)失效其他迭代器.解決辦法兩種冠桃,erase(*iter)會(huì)返回下一個(gè)有效迭代器的值命贴,或者erase(iter++).

樹(shù)形數(shù)據(jù)結(jié)構(gòu): 使用紅黑樹(shù)來(lái)存儲(chǔ)數(shù)據(jù),插入不會(huì)使得任何迭代器失效食听;刪除運(yùn)算使指向刪除位置的迭代器失效胸蛛,但是不會(huì)失效其他迭代器.erase迭代器只是被刪元素的迭代器失效,但是返回值為void樱报,所以要采用erase(iter++)的方式刪除迭代器胚泌。
注意:經(jīng)過(guò)erase(iter)之后的迭代器完全失效,該迭代器iter不能參與任何運(yùn)算肃弟,包括iter++,*ite

總結(jié)部分引用了csdn一篇文章:https://blog.csdn.net/lujiandong1/article/details/49872763

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末玷室,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子笤受,更是在濱河造成了極大的恐慌穷缤,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,627評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件箩兽,死亡現(xiàn)場(chǎng)離奇詭異津肛,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)汗贫,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,180評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)身坐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人落包,你說(shuō)我怎么就攤上這事部蛇。” “怎么了咐蝇?”我有些...
    開(kāi)封第一講書(shū)人閱讀 169,346評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵涯鲁,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng)抹腿,這世上最難降的妖魔是什么岛请? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 60,097評(píng)論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮警绩,結(jié)果婚禮上崇败,老公的妹妹穿的比我還像新娘。我一直安慰自己肩祥,他們只是感情好僚匆,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,100評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著搭幻,像睡著了一般咧擂。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上檀蹋,一...
    開(kāi)封第一講書(shū)人閱讀 52,696評(píng)論 1 312
  • 那天松申,我揣著相機(jī)與錄音,去河邊找鬼俯逾。 笑死贸桶,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的桌肴。 我是一名探鬼主播皇筛,決...
    沈念sama閱讀 41,165評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼坠七!你這毒婦竟也來(lái)了水醋?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 40,108評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤彪置,失蹤者是張志新(化名)和其女友劉穎拄踪,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體拳魁,經(jīng)...
    沈念sama閱讀 46,646評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡惶桐,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,709評(píng)論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了潘懊。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片姚糊。...
    茶點(diǎn)故事閱讀 40,861評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖授舟,靈堂內(nèi)的尸體忽然破棺而出救恨,到底是詐尸還是另有隱情,我是刑警寧澤岂却,帶...
    沈念sama閱讀 36,527評(píng)論 5 351
  • 正文 年R本政府宣布忿薇,位于F島的核電站裙椭,受9級(jí)特大地震影響躏哩,放射性物質(zhì)發(fā)生泄漏署浩。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,196評(píng)論 3 336
  • 文/蒙蒙 一扫尺、第九天 我趴在偏房一處隱蔽的房頂上張望筋栋。 院中可真熱鬧,春花似錦正驻、人聲如沸弊攘。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,698評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)襟交。三九已至,卻和暖如春伤靠,著一層夾襖步出監(jiān)牢的瞬間捣域,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,804評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工宴合, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留焕梅,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,287評(píng)論 3 379
  • 正文 我出身青樓卦洽,卻偏偏與公主長(zhǎng)得像贞言,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子阀蒂,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,860評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容