遇見(jiàn)的場(chǎng)景
刪除vector容器指定元素時(shí)昵慌;
erase()函數(shù)的用法
vector::erase():從指定容器刪除指定位置的元素或某段范圍內(nèi)的元素鞍匾。
具體用法如下:
iterator erase(iterator _Where);
刪除指定位置的元素满葛,返回值是一個(gè)迭代器绢慢,指向刪除元素的下一個(gè)元素婴梧;
iterator erase( iterator _First, iterator _Last);
刪除從_First開(kāi)始到_Last位置的元素矗积,返回值也是一個(gè)迭代器蔓倍,指向最后一個(gè)刪除元素的下一個(gè)位置悬钳。
erase()函數(shù)的注意點(diǎn)
注意1:調(diào)用erase()函數(shù)之后,vector后面的元素會(huì)向前移位默勾,形成新的容器。這樣被刪除的元素對(duì)應(yīng)的迭代器聚谁,此時(shí)會(huì)變成一個(gè)野指針母剥。
注意2:刪除最后一個(gè)元素時(shí)形导,it指向vec.end(),然后會(huì)對(duì)vec.end()之上執(zhí)行++操作炫隶,從而出現(xiàn)段錯(cuò)誤(見(jiàn)上一篇博客)伪阶。所以需要加入if判斷來(lái)避免栅贴。
即下述代碼為錯(cuò)
for(auto it = vec.begin(); it != vec.end(); ++it){
if(*it == target)
vec.erase(it);//此時(shí)it變?yōu)橐爸羔橀苁恚皇侵赶騰ec的下一個(gè)元素哄酝。
}
erase()正確使用方式
for(auto it = vec.begin(); it != vec.end(); ){
if(*it == target)
it = vec.erase(it);//此時(shí)it指向被刪除元素的下一個(gè)位置。
else
it++;
}
或者
for(auto it = vec.begin(); it != vec.end(); ){
if(*it == target)
auto it2 = it;
vec.erase(it2);//此時(shí)it指向被刪除元素的下一個(gè)位置祷膳。
else
it++;
}