面试的时候碰到的一道题,答的稀烂,特意查了一下资料,在此做下总结
其实失效的情况无非是对当前的STL容器进行了修改,这里尤其应该注意这样一个概念,迭代器不能看作是指针,迭代器不能看作是指针,迭代器不能看作是指针,重要的事情说3遍!!!
下面列举一下具体会有问题的情况:
(1)先说删除元素
对于vector和string,删除点之前的迭代器,指针和引用都是有效的,off-the-end迭代器总是失效
对于deque,删除点如果不是front和back,迭代器,指针和引用全部失效,如果删除点是front和back,off-the-end失效,其他的迭代器,指针和引用都有效。
(2)再说一下新增元素
对于vector和string,如果容器内存被重新分配,迭代器,指针和引用全部失效,如果没有重新分配,那么插入点之前的迭代器有效,插入点之后的迭代器失效。
对于deque,插入点如果不是front和back,迭代器,指针和引用全部失效,如果插入点是front和back,off-the-end失效,其他的迭代器,指针和引用都有效。
所以说了这么多,究竟该怎么处理呢?不多废话,直接上代码
删除:
int arr[]={0,1,2,3,4,5,6,7,8,9,10};
vector a(arr,arr+sizeof(arr)/sizeof(*arr));
for (auto it = a.begin(); it != a.end();){
if ((*it)&1){
it=a.erase(it);
}
else
++it;
}
插入:
int arr[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
deque v(arr,arr+sizeof(arr)/sizeof(*arr));
for (auto it = v.begin(); it != v.end(); )
{
if ((*it) & 1)
{
it = v.insert(it, *it);
it += 2;
}
else
it = v.erase(it);
}
这里还有一点需要注意,别存储off-the-end迭代器,直接利用end()方法获取就好了