vector迭代器什么時候會失效?
一、 push_back導致迭代器失效
vector在push_back的時候當容量不足時會觸發擴容,導致整個vector重新申請內存,並且將原有的數據復制到新的內存中,並將原有內存釋放,這自然是會導致迭代器失效的,因為迭代器所指的內存都已經被釋放。
二、insert導致迭代器失效
insert導致的迭代器失效有兩種情況:
(1)插入操作導致vector擴容,迭代器失效原因和push_back相同
(2)插入操作引起vector內元素移動,導致被移動部分的迭代器失效
三、erase導致迭代器失效
刪除操作引起vector內元素移動,導致被移動部分的迭代器失效。
關聯性容器迭代器何時失效?
對於關聯容器(如map, set,multimap,multiset),刪除當前的iterator,僅僅會使當前的iterator失效,只要在erase時,遞增當前iterator即可。這是因為map之類的容器,使用了紅黑樹來實現,插入、刪除一個結點不會對其他結點造成影響。erase迭代器只是被刪元素的迭代器失效,但是返回值為void,所以要采用erase(iter++)的方式刪除迭代器。
鏈表式容器迭代器何時失效?
對於鏈表式容器(如list),刪除當前的iterator,僅僅會使當前的iterator失效,這是因為list之類的容器,使用了鏈表來實現,插入、刪除一個結點不會對其他結點造成影響。只要在erase時,遞增當前iterator即可,並且erase方法可以返回下一個有效的iterator。
四、總結
迭代器失效分三種情況考慮,也是分三種數據結構考慮,分別為數組型,鏈表型,樹型數據結構。
數組型數據結構:(vector)該數據結構的元素是分配在連續的內存中,insert和erase操作,都會使得刪除點和插入點之后的元素挪位置,所以,插入點和刪除掉之后的迭代器全部失效,也就是說insert(*iter)(或erase(*iter)),然后在iter++,是沒有意義的。解決方法:erase(*iter)的返回值是下一個有效迭代器的值。 iter =cont.erase(iter);
鏈表型數據結構:(list)對於list型的數據結構,使用了不連續分配的內存,刪除運算使指向刪除位置的迭代器失效,但是不會失效其他迭代器.解決辦法兩種,erase(*iter)會返回下一個有效迭代器的值,或者erase(iter++).
樹形數據結構: (map,set)使用紅黑樹來存儲數據,插入不會使得任何迭代器失效;刪除運算使指向刪除位置的迭代器失效,但是不會失效其他迭代器.erase迭代器只是被刪元素的迭代器失效,但是返回值為void,所以要采用erase(iter++)的方式刪除迭代器。
注意:經過erase(iter)之后的迭代器完全失效,該迭代器iter不能參與任何運算,包括iter++,*ite