erase

lzybeyond 2013-03-26 10:15:59
如果用erase删除一个元素的话会导致迭代器失效吗?
如:
vector<int>::iterator iter;
for(iter=v1.begin();iter!=v1.end();iter++)
{
v1.erase(v1.begin());//这一步后迭代器会失效吗?
}
...全文
122 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
iamnobody 2013-03-26
  • 打赏
  • 举报
回复
http://en.cppreference.com/w/cpp/container/vector/erase 链接详解.
tofu_ 2013-03-26
  • 打赏
  • 举报
回复
引用 3 楼 lzybeyond 的回复:
引用 2 楼 zhoujielunzhimi 的回复:vector<int>::iterator iter = v1.begin(); while(iter!=v1.end()) { iter = v1.erase(iter); } 那我这样改一下迭代器能重新有效吗??? vector<int>::iterator iter; for(iter=……
这样修改之后迭代器iter确实会重新有效。不过你不删除iter++这一句的话,可能又会出现错误哦~ 如果v1中只有一个元素,那么删除起始元素一次之后,v1为空,iter=v1.begin()等同于iter = v1.end();而对一个end()再++是不合法的行为。 #4说的“erase之后会导致迭代器指向被删除元素的下一个。”这是从外部效果上来看的。意思是对于vector{1, 2, 3, 4},最开始iter指向的元素的值为1,erase之后,再查看*iter一般来说是2,所以看起来像是迭代器指向位置改变了。其实迭代器本身是不会发生改变的,改变的只是迭代器指向的位置的元素值。就像我存了你家的地址,但是你突然搬家了,所以我找不上你了。此时你不能怪我把通讯录搞错了,只能怪你搬家不告诉我。
tofu_ 2013-03-26
  • 打赏
  • 举报
回复
你删除一个元素的时候,vector长度减少,对空间的需求也少,c++标准从来没说vector不允许收缩存储空间,所以,理论上所有从该vector获取的迭代器都可能失效。即使vector不收缩,原先的迭代器指向的元素也可能不是原来那个了(视迭代器的相对位置而定),或者指向无效数据,也算是失效。如果担心这个问题,可以考虑list或map等依赖节点的容器,这些迭代器中erase一个节点的时候其他迭代器不会失效。
sumos 2013-03-26
  • 打赏
  • 举报
回复
引用 3 楼 lzybeyond 的回复:
引用 2 楼 zhoujielunzhimi 的回复:vector<int>::iterator iter = v1.begin(); while(iter!=v1.end()) { iter = v1.erase(iter); } 那我这样改一下迭代器能重新有效吗??? vector<int>::iterator iter; for(iter=……
erase之后会导致迭代器指向被删除元素的下一个。 所以你这里的iter++就有问题
lzybeyond 2013-03-26
  • 打赏
  • 举报
回复
引用 2 楼 zhoujielunzhimi 的回复:
vector<int>::iterator iter = v1.begin(); while(iter!=v1.end()) { iter = v1.erase(iter); }
那我这样改一下迭代器能重新有效吗??? vector<int>::iterator iter; for(iter=v1.begin();iter!=v1.end();iter++) { v1.erase(v1.begin());//这一步后迭代器会失效吗? iter=v1.begin(); //这样改后呢??? }
sumos 2013-03-26
  • 打赏
  • 举报
回复
vector<int>::iterator iter = v1.begin(); while(iter!=v1.end()) { iter = v1.erase(iter); }
意吟 2013-03-26
  • 打赏
  • 举报
回复

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧