vector迭代器失效指合法迭代器因扩容或元素移动而指向无效内存,导致未定义行为;根本原因是底层动态数组重分配。insert/erase/push_back(扩容时)/clear/reserve(容量增大时)均会使其失效。
vector迭代器失效,是指原本合法有效的迭代器,在某些操作后变得不可用——继续解引用或递增它,会导致未定义行为(比如程序崩溃、数据错乱)。根本原因是vector底层是动态数组,当容量不足触发扩容时,所有元素会被复制/移动到新内存,原地址上的迭代器自然就“指向了废墟”。
关键看是否可能引起内存重分配或元素位置变动:
边遍历边erase最典型也最容易出错。错误写法:for (auto it = v.begin(); it != v.end(); ++it) { if (...) v.erase(it); } —— erase后it已失效,++it就是踩内存。
正确做法分两种场景:
erase–remove idiom(推荐)v.erase(std::remove_if(v.begin(), v.end(), pred), v.end());
auto it = v.begin();
while (it != v.end()) {
if (should_remove(*it)) it = v.erase(it);
else ++it;
}
reserve()足够空间,减少扩容概率(尤其批量push_back前)at()或下标访问代替迭代器——下标在vector里不会“失效”,只是越界会抛异常(更可控)索引(size_t)或指针(T*)(注意:指针在扩容后也会失效!索引最稳)-D_GLIBCXX_DEBUG),能捕获大部分迭代器误用
本质上,vector迭代器失效不是bug,而是设计取舍:用连续内存换随机访问性能,就得承担重分配代价。理解它何时发生、为何发生,比死记规则更重要。基本上就这些。