c++中vector迭代器失效(iterator invalidation)是什么_c++ STL容器避坑指南【核心】

admin 百科 13
vector迭代器失效指合法迭代器因扩容或元素移动而指向无效内存,导致未定义行为;根本原因是底层动态数组重分配。insert/erase/push_back(扩容时)/clear/reserve(容量增大时)均会使其失效。

c++中vector迭代器失效(iterator invalidation)是什么_c++ STL容器避坑指南【核心】-第1张图片-佛山资讯网

vector迭代器失效,是指原本合法有效的迭代器,在某些操作后变得不可用——继续解引用或递增它,会导致未定义行为(比如程序崩溃、数据错乱)。根本原因是vector底层是动态数组,当容量不足触发扩容时,所有元素会被复制/移动到新内存,原地址上的迭代器自然就“指向了废墟”。

哪些操作会让vector迭代器失效?

关键看是否可能引起内存重分配或元素位置变动:

  • insert() / emplace() 在中间或开头插入:所有指向插入点及之后元素的迭代器全部失效(包括end())
  • erase() 删除任意元素:被删元素及其之后所有元素的迭代器失效;返回值是新的有效迭代器(指向原删除位置的下一个)
  • push_back() / emplace_back() 触发扩容时所有迭代器(包括begin(), end(), cbegin()等)全部失效
  • clear() / resize(0) / swap() 与空vector交换:所有迭代器失效
  • reserve() 不改变size,但可能重分配内存:若新容量 > 当前capacity,所有迭代器失效

怎么安全地遍历+修改vector?

边遍历边erase最典型也最容易出错。错误写法:for (auto it = v.begin(); it != v.end(); ++it) { if (...) v.erase(it); } —— erase后it已失效,++it就是踩内存。

正确做法分两种场景:

标签: c++ red

发布评论 0条评论)

还木有评论哦,快来抢沙发吧~