1. 程式人生 > >STL刪除迭代器

STL刪除迭代器

1.關聯容器刪除一個迭代器對其他迭代器不會造成影響,返回的是void型。

2.序列容器刪除一個迭代器後會造成後面的所有迭代器都往前移動一個位置,因此先前儲存的迭代器都會失效,返回的是被刪除後新複製到被刪除位置的元素的迭代器。

——————————

C++中利用迭代器刪除元素會發生什麼? (1)對於關聯容器(如map,set,multimap,multiset),刪除當前的iterator,僅僅會使當前的iterator失效,只要在erase時,遞增當前的iterator即可。這是因為map之類的容器,使用了紅黑樹來實現,插入,刪除一個結點不會對其他結點造成影響。使用方式如下例子:
  1. set<
    int> valset = { 1,2,3,4,5,6 };  
  2. set<int>::iterator iter;  
  3. for (iter = valset.begin(); iter != valset.end(); )  
  4. {  
  5.      if (3 == *iter)  
  6.           valset.erase(iter++);  
  7.      else
  8.           ++iter;  
  9. }  

因為傳給erase的是iter的一個副本,iter++是下一個有效的迭代器。 (2)對於序列式容器(如vector,deque,list等),刪除當前的iterator會使後面所有元素的iterator都失效。這是因為vector,deque使用了連續分配的記憶體,刪除一個元素導致後面所有的元素會向前移動一個位置。不過erase方法可以返回下一個有效的iterator。使用方式如下,例如:
  1. vector<int> val = { 1,2,3,4,5,6 };  
  2. vector<int>::iterator iter;  
  3. for (iter = val.begin(); iter != val.end(); )  
  4. {  
  5.      if (3 == *iter)  
  6.           iter = val.erase(iter);     //返回下一個有效的迭代器,無需+1
  7.      else
  8.           ++iter;  
  9. }