迭代器失效
添加/删除元素可能会使迭代器失效
insert 或 push操作都可能导致迭代器 失效。
- 对于vector和string,添加/删除元素位置之后的迭代器失效。
- 对于deque,插入到除了首尾位置之后元素的迭代器、指针、引用都会失效。
- 对于list、forward_list不会失效,因为加入了新元素之后,迭代器会进行更新。
当编写循环将元素插入到vector或者deque容器时,程序必须保证迭代器在每次循环后都得到更新。
重定位迭代器
在进行了添加或者删除之后,程序员需要自己进行迭代器的更新。
// 要求:若是奇数元素,则复制,否则,删除偶数元素
vector<int> vi = {1,2,3,4,5,6,7,8,9};
auto iter = vi.begin();
while(iter != vi.end()){
if(*iter % 2 ==1){
iter = vi.insert(iter, *iter);
iter += 2;
}
else{
iter = vi.erase(iter);//iter指向我们删除之后的元素
}
}
在这个代码里面,添加了元素之后,end()肯定会变化,而last = v.end()
,last这个迭代器却没有变化,导致了存储在last中的迭代器失效。last不再指向的v的最后一个元素了。
不要保存end的迭代器
vector<int> v;
auto begin = v.begin(), end = v.end();
while (begin != end) {
++begin;
begin = v.insert(begin, 42);
++begin;
}
当加了insert之后,end这个迭代器就失效了,它不是指向v中的任何元素,而是指向了v中尾元素之后的位置。因此这个代码会陷入死循环。
所以正确做法是
while(begin != v.end()){
++begin;
begin = v.insert(begin, 42);
++begin;
}