说到容器增减元素时,对迭代器的影响,我们需要考虑到连续内存容器和非连续内存容器,在增加和减少元素时对迭代器的影响。
连续内存容器
对于连续内存容器,如vector、deque等,增减元素均会使得当前迭代器之后的所有迭代器失效。例如,当使用erase()删除元素后,此时的迭代器相当于是指向了被删除元素的下一个元素的有效迭代器。删除元素时常见的编程写法为:
for(auto iter = myvec.begin(); iter != myvec.end()) //另外注意这里用 "!=" 而非 "<"
{
if(/*满足删除条件*/)
iter = myvec.erase(iter);
else
++iter;
}
非连续内存容器
对于非连续内存容器,如set、map等。增减元素只会使得当前迭代器无效。仍以删除元素为例,由于删除元素后,erase()返回的迭代器将是无效的迭代器。因此,需要在调用erase()之前,就使得迭代器指向删除元素的下一个元素。常见的编程写法为:
for(auto iter = myset.begin(); iter != myset.end()) //另外注意这里用 "!=" 而非 "<"
{
if(/*满足删除条件*/)
myset.erase(iter++); //使用一个后置自增就OK了
else
++iter;
}
重要说明
欢迎大家关注我的个人微信公众号,一起探讨和学习C++语言、各种计算机知识、交流职场心得,以及您想了解的各种程序员相关的知识与心得!