101人参与 • 2025-05-11 • C/C++
在 c++ 中,迭代器(iterator) 是一种类似指针的对象,用于遍历 stl 容器(如 vector、list、map 等)。
迭代器失效是指在对容器进行某些操作(如插入、删除)后,原本有效的迭代器变得不可用,继续使用它会导致 未定义行为(undefined behavior, ub),如程序崩溃、数据错误等
不同的容器有不同的迭代器失效规则,本文主要讨论 vector 的迭代器失效问题。
当向 vector 插入元素时:
size() == capacity()(容量已满):
vector 会重新分配更大的内存,并拷贝原有数据。begin(), end() 等)。size() < capacity()(容量未满):vector<int> v = {1, 2, 3};
auto it = v.begin(); // it 指向 1
v.push_back(4); // 可能触发重新分配内存
cout << *it; // ❌ 危险!it 可能失效reserve()):vector<int> v; v.reserve(100); // 预留 100 个元素的空间 auto it = v.begin(); v.push_back(1); // 不会重新分配,it 仍然有效
当从 vector 删除元素时:
vector<int> v = {1, 2, 3, 4};
auto it = v.begin() + 2; // it 指向 3
v.erase(v.begin() + 1); // 删除 2
cout << *it; // ❌ 危险!it 已经失效(3 已经前移)erase 的返回值(返回下一个有效迭代器):vector<int> v = {1, 2, 3, 4};
auto it = v.begin();
while (it != v.end()) {
if (*it % 2 == 0) {
it = v.erase(it); // 删除并更新 it
} else {
it++; // 否则正常递增
}
}反向遍历(避免迭代器失效)
for (auto it = v.rbegin(); it != v.rend(); ) {
if (*it % 2 == 0) {
it = vector<int>::reverse_iterator(v.erase(it.base() - 1));
} else {
it++;
}
}| 容器 | 插入操作(insert) | 删除操作(erase) |
|---|---|---|
vector | 可能失效(取决于容量) | 被删除及后面的失效 |
deque | 可能失效(首尾安全) | 被删除及附近的失效 |
list | 不会失效 | 仅被删除的失效 |
map/set | 不会失效 | 仅被删除的失效 |
vector 插入时:
reserve() 或使用索引。vector 删除时:erase 返回值或反向遍历。list、map)通常更安全,但仍需谨慎。最佳实践:
range-based for 或算法(如 remove_if),减少手动管理迭代器。-d_glibcxx_debug(gcc)检测迭代器错误。以上就是c++迭代器失效的避坑指南的详细内容,更多关于c++迭代器失效的资料请关注代码网其它相关文章!
您想发表意见!!点此发布评论
版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。
发表评论