迭代器的失效问题:对容器的操作影响了元素的存放位置,称为迭代器失效。
失效情况:
- 当容器调用
erase()方法后,当前位置到容器末尾元素的所有迭代器全部失效。 - 当容器调用
insert()方法后,当前位置到容器末尾元素的所有迭代器全部失效。 - 如果容器扩容,在其他地方重新又开辟了一块内存。原来容器底层的内存上所保存的迭代器全都失效了。
int main() {
vector<int> q{1, 2, 3, 4, 5, 6};
for (auto it = q.begin(); it != q.end(); it++) {
cout << *it << endl;
if (*it == 2) {
it = q.erase(it);
}
}
// 1 2 4 5 6
}
vector 是连续分配内存,在 erase 之后导致后面的元素向前移动一个位置,元素的位置发生了变化,所以没有打印3。
解决方案是:利用erase方法可以返回下一个有效的 iterator。
注意:for 的()中没有 it++。
int main() {
vector<int> q{1, 2, 3, 4, 5, 6};
for (auto it = q.begin(); it != q.end();) {
cout << *it << " ";
if (*it == 2) {
it = q.erase(it);
} else {
it++;
}
}
}