STL 在循环中做某些事情

licup 2009-01-08 03:00:40
在effective STL中有这样一句话
STL 在循环中做某些事情
“如果容器是标准关联容器,写一个循环来遍历容器元素,当你把迭代器传给erase时记得后置递增它。”
请问这个后置递增是怎么意思
...全文
318 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
harry330 2009-01-11
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 calm_star 的回复:]
erase时使用后置递增,在删除当前it所指对象的同时也使it正确递增,保证循环的进行
[/Quote]

正解,不过为了避免这种迭代器失效问题,最好用std算法,然后传递一个仿函数(函数子)。。
fancy_zhh 2009-01-09
  • 打赏
  • 举报
回复
叠加iterator
derelictangel 2009-01-09
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 lann64 的回复:]
后置递增保证了迭代器的正确性。
用前置递增,删除的是迭代器指向元素,然后迭代器失效,不能在循环里面进行下一轮了。
后置递增先移动了迭代器,删除的是迭代器移动前位置的元素,这样保留下来的迭代器还是有效的,可以继续循环。
[/Quote]

PS:
我的目标是 ---->

^_^
pclili 2009-01-09
  • 打赏
  • 举报
回复
后置就是写在后面吧.
拆开了,程序有可能就挂了.拆不得...
herman~~ 2009-01-09
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 hai040 的回复:]
set.erase(it++);
[/Quote]

同意 关键是预防出现循环迭代器失效的问题
chenchangxiong 2009-01-08
  • 打赏
  • 举报
回复
释放掉不是得这么干

iter=deq.erase(iter);
nineforever 2009-01-08
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 hai040 的回复:]
vc关联容器erase返回迭代器
查了一下Effective STL,里面说标准关联容器erase返回void
[/Quote]

可以参考我的博客
C++03标准中的几处缺陷
http://blog.csdn.net/nineforever/archive/2008/10/09/3044641.aspx
Jinhao 2009-01-08
  • 打赏
  • 举报
回复
如果用VC,完全可以it = container.erase(it); 不管什么容器.

对于标准,这个问题很幽默.以前曾有人提出这个问题,但被否决,现在又重新考虑这个问题,已经确定新标准修改这个问题
hai040 2009-01-08
  • 打赏
  • 举报
回复
vc关联容器erase返回迭代器
查了一下Effective STL,里面说标准关联容器erase返回void
hai040 2009-01-08
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 Jinhao 的回复:]
最通用的方法是it = container.erase(it);
如果把这段话当结论是很容易忽略掉 前面那个如果条件.那本书中的那段话只针对关联容器来说的.
[/Quote]
关联容器erase返回是void吧
yshuise 2009-01-08
  • 打赏
  • 举报
回复
关联容器和顺序容器不同。楼主自己注意一下。
Jinhao 2009-01-08
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 elmnd 的回复:]
引用 1 楼 hai040 的回复:
set.erase(it++);

要不拆开啊。
set.erase(it);
++it;

[/Quote]

错了..都erase了何来给你it做++?

[Quote=引用 10 楼 nullah 的回复:]
引用 5 楼 xiaoyisnail 的回复:
引用 4 楼 lann64 的回复:
后置递增保证了迭代器的正确性。
用前置递增,删除的是迭代器指向元素,然后迭代器失效,不能在循环里面进行下一轮了。
后置递增先移动了迭代器,删除的是迭代器移动前位置的元素,这样保留下来的迭代器还是有效的,可以继续循环。


防止迭代器失效

yes
[/Quote]

最简单的办法 还是 it = container.erase(it);
比如vector.erase(it++); 这时的it应该是下下个元素了...
看来很容易忽略 "如果容器是标准关联容器" 这段话.
nullah 2009-01-08
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 xiaoyisnail 的回复:]
引用 4 楼 lann64 的回复:
后置递增保证了迭代器的正确性。
用前置递增,删除的是迭代器指向元素,然后迭代器失效,不能在循环里面进行下一轮了。
后置递增先移动了迭代器,删除的是迭代器移动前位置的元素,这样保留下来的迭代器还是有效的,可以继续循环。


防止迭代器失效
[/Quote]
yes
waizqfor 2009-01-08
  • 打赏
  • 举报
回复
UP了
elmnd 2009-01-08
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 hai040 的回复:]
set.erase(it++);
[/Quote]
要不拆开啊。
set.erase(it);
++it;
Jinhao 2009-01-08
  • 打赏
  • 举报
回复
最通用的方法是it = container.erase(it);
如果把这段话当结论是很容易忽略掉 前面那个如果条件.那本书中的那段话只针对关联容器来说的.
AlwaysSLH 2009-01-08
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 lann64 的回复:]
后置递增保证了迭代器的正确性。
用前置递增,删除的是迭代器指向元素,然后迭代器失效,不能在循环里面进行下一轮了。
后置递增先移动了迭代器,删除的是迭代器移动前位置的元素,这样保留下来的迭代器还是有效的,可以继续循环。
[/Quote]

学习了
xiaoyisnail 2009-01-08
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 lann64 的回复:]
后置递增保证了迭代器的正确性。
用前置递增,删除的是迭代器指向元素,然后迭代器失效,不能在循环里面进行下一轮了。
后置递增先移动了迭代器,删除的是迭代器移动前位置的元素,这样保留下来的迭代器还是有效的,可以继续循环。
[/Quote]

防止迭代器失效
lann64 2009-01-08
  • 打赏
  • 举报
回复
后置递增保证了迭代器的正确性。
用前置递增,删除的是迭代器指向元素,然后迭代器失效,不能在循环里面进行下一轮了。
后置递增先移动了迭代器,删除的是迭代器移动前位置的元素,这样保留下来的迭代器还是有效的,可以继续循环。
猪翼天翔 2009-01-08
  • 打赏
  • 举报
回复
erase时使用后置递增,在删除当前it所指对象的同时也使it正确递增,保证循环的进行
加载更多回复(2)

65,211

社区成员

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

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