关于迭代器

迭代器失效问题

迭代器失效: 对于容器的操作影响了元素存在的位置导致迭代器失效

由于我菜, 暂时只考虑由于删除导致的迭代器失效问题

在stl中,有3种结构的容器: 数组型, 链表型, 树形

对于所有的删除, 都可以使用以下代码

1
2
3
4
5
for(it=a.begin();it!=a.end();)
{
if(...) it++;
else it = a.erase(it);
}

每种结构有其特殊情况

对于vector而言:

1
2
3
4
5
6
vector<int>::iterator it;
for(it=a.begin();it!=a.end();)
{
if(...) it++;
else a.erase(it);
}

是可以这样删除的,因为vector本质上是一个连续空间, 所以返回的就是下一个地址

对于deque不一定(还没学, 等我学了来补)

对于链表型和树形容器, 由于删完当前迭代器不会导致后面的迭代器失效, 但是会导致当前迭代器失效, 所以也可以采用下面的方法删除

1
2
3
4
5
for(it=a.begin()l it!=a.end())
{
if(...) it++;
else a.erase(it++);
}