今個(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)行
然而如若注掉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