容器迭代器失效的几种情况总结
一、序列型容器
包括vector,deque,string等,其特点是元素存储在连续内存中,插入和删除会导致之后的元素移动,所以插入和删除都会导致插入/删除点及其之后的所有迭代器失效。
在循环中删除元素的正确写法:
for(auto it = nums.begin(); it != nums.end(); )
if (...) it = nums.erase(it); // erase返回下一个有效的迭代器
else ++it;
二、关联型容器
包括map,set,unordered_set等,其特点是使用红黑树来存储元素,插入不会使任何迭代器失效,删除会使指向删除点的那一个迭代器失效,其余不会失效。
在循环中删除元素的正确写法:
for (auto it = map.begin(); it != map.end; )
if (.

本文总结了C++中不同类型的容器(序列型、关联型、链表型)中迭代器失效的情况,强调了在循环中删除元素的正确做法。特别指出,当容器作为引用传参时,可能导致迭代器失效的问题,例如在解决全排列问题中,由于引用传参导致的迭代器失效引发了段错误。解决方案是避免在回溯过程中使用引用,以防止迭代器的意外改变。
最低0.47元/天 解锁文章
694

被折叠的 条评论
为什么被折叠?



