一:迭代器失效問題
對於節點式容器(map,list,forward_list,set)元素的刪除,插入操作會導致指向該元素的迭代器,指針,引用失效,但是其他元素迭代器,指針,引用不受影響
對於順序式容器(vector,string)元素的插入肯定會導致指向該元素以及後面的元素迭代器,指針,引用失效,有可能會導致所有迭代器,指針,引用失效。取決於vector插入時預留的額外存儲空間是否夠用,需不需要重新分配新的存儲空間,把原來存儲在舊空間的元素全部複製到新的存儲空間然後再插入新的元素,最後撤銷舊的存儲空間。但刪除元素時,尾後迭代器總是失效,被刪元素之前的迭代器,引用和指針仍有效
deque 插入到除首尾位置之外的任何位置都會導致迭代器,指針,和引用失效,如果是在首尾位置添加元素,迭代器會失效,但指向存在的元素的引用和指針不會失效。
在首尾之外的任何位置刪除元素,那麼指向被刪除元素外的其他元素的迭代器,引用和指針都會失效,如果刪除的是尾元素,尾後迭代器也會失效,但其他迭代器,引用和指針不受到影響,如果是刪除首元素。這些也不會受到影響
最保險的方式是,當使用一個容器的insert或者erase函數通過迭代器插入或刪除元素時,獲取insert和erase返回的指向下一個元素的迭代器,以便用來重新獲取新的有效的迭代器
erase返回的迭代器已經指向下一個元素,調用insert後,需要遞增迭代器2次,在給定位置之前插入新元素,返回指向新插入的元素的迭代器
不要保存end返回的迭代器,必要時候重新調用end方法
#include<iostream>
#include<vector>
using namespace std;
int main()
{
vector<int> array;
array.push_back(1);
array.push_back(6);
array.push_back(3);
array.push_back(6);
array.push_back(6);
array.push_back(2);
vector<int>::iterator itor;
for(itor=array.begin();itor!=array.end();)
{
if(6==*itor)
{
itor=array.erase(itor);
}
else
{
itor++;
}
}
itor=array.begin();
for(itor=array.begin();itor!=array.end();)
{
cout<<(*itor++);
}
system("pause");
return 0;
}
二:函數返回迭代器
迭代器本質就是指針,*ite 和 ite->second 都返回迭代器iter所指元素的引用