在序列容器里,删除了当前的iterator 导致后边所有元素的迭代器都会失效 增加一个元素也会导致后边的元素进行移动
因为vector、deque是序列容器,使用连续分配的内存,删除当前元素,后边的所有元素都会向前移动一个位置,之后数据的地址发生了变化,之前的迭代器根据原有容器的信息访问不到正确的内容。
使用earse方法删除元素的时候 erase方法会返回下一个元素的迭代器(有效);用迭代器iterator 来接收返回后新的迭代器的值。
#if 1
#include <iostream>
#include <vector>
#include <deque>
using namespace std;
int main()
{
vector<int> deque1;
for(auto i = 0; i < 6; ++i)
{
deque1.push_back(i);
}
auto it = deque1.begin();
for(; it != deque1.end();)
{
if(*it > 2)
it = deque1.erase(it); //会返回迭代器的下一个值
else
it++;
}
it = deque1.begin();
for(; it != deque1.end(); ++it)
{
cout << *it << endl;
}
return 0;
}
#endif
在关联容器里: set map multimap multiset
删除了当前的迭代器,会使当前的迭代器失效,因为这类容器底层使用红黑树实现的,红黑树的特点 插入、删除节点对其他节点不会造成影响, 删除了当前的迭代器,当前的迭代器会失效,即迭代器进行++自增操作会出现问题,所以在迭代器失效之前先对迭代器进行自增操作。
Map.erase(it++);
在这个语句里:把it自增之前的值传递到eraser方法里,然后it迭代器自增,自增之后执行eraser方法,自增之前的迭代器就已经失效了。
list容器同关联容器一样。 是不连续的内存,处理迭代器失效的问题,处理方法也一样。