容器迭代器失效的几种情况总结
一、序列型容器
包括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 (.