在vector中刪除,大家都知道,直接erase的話,這種寫法很有問題。因為erase(iter)之后iter指針就變成野指針了,此時繼續iter++就會出問題。
1 for(auto iter = v.begin(), iter!=v.end(); iter++) 2 { 3 if(iter == 3) 4 v.erase(iter); 5 }
因此vector中正確的刪除的方法是:
for(auto iter = v.begin(), iter!=v.end(); /*iter++*/) { if(iter == 3) iter = v.erase(iter); else iter++; }
但是在map中,正確的刪除方法是:
for(auto iter1 = theMap.begin(); iter1 != theMap.end(); ) { if(iter1->second == xxx) { theMap.erase(iter1++); } else { ++iter1; } }
因為對於map這種以指針構建起來的容器來說,可以保證一個元素刪除了,不影響指向其它元素的迭代器。
總結:(轉自:http://blog.csdn.net/hellokandy/article/details/52327549)
STL中的容器按存儲方式分為兩類:一類是序列容器(如:vector,deque),另一類是關聯容器(如:list,map,set)。
在使用erase方法刪除元素時,有幾點需要注意:
1) 對於關聯容器(如map, set,multimap,multiset),刪除當前的iterator,僅僅會使當前的iterator失效,只要在erase時,遞增當前iterator即可。這是因為map之類的容器,使用了紅黑樹來實現,插入、刪除一個結點不會對其他結點造成影響。
2)對於序列式容器(如vector,deque),刪除當前的iterator會使后面所有元素的iterator都失效。這是因為vetor,deque使用了連續分配的內存,刪除一個元素導致后面所有的元素會向前移動一個位置。還好erase方法可以返回下一個有效的iterator。
3)對於list來說,它使用了不連續分配的內存,並且它的erase方法也會返回下一個有效的iterator,因此上面兩種正確的方法都可以使用。
