一:迭代器失效问题
对于节点式容器(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所指元素的引用