社区
C++ 语言
帖子详情
STL 在循环中做某些事情
licup
2009-01-08 03:00:40
在effective STL中有这样一句话
STL 在循环中做某些事情
“如果容器是标准关联容器,写一个循环来遍历容器元素,当你把迭代器传给erase时记得后置递增它。”
请问这个后置递增是怎么意思
...全文
318
22
打赏
收藏
STL 在循环中做某些事情
在effective STL中有这样一句话 STL 在循环中做某些事情 “如果容器是标准关联容器,写一个循环来遍历容器元素,当你把迭代器传给erase时记得后置递增它。” 请问这个后置递增是怎么意思
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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)
STL
算法涉猎
int x;int y;if (one.x!
STL
算法之sort
STL
所提供的各式各样算法
中
,sort()是最复杂最庞大的一个。这个算法接受两个RandomAccessIterators(随机存取迭代器),然后将区间内的所有元素以渐增方式由小到大重新排列。还有一个版本则是允许用户指定一个仿函数代替operator
STL
——vector
STL
-vector
《学习
STL
》-1.
STL
简介
引言 当你C++入门后,学了些C++编程规则,正如《C++Primer》里的内容,你知道C++里面的基本数据类型、
循环
、判断、函数、类、模板等。这阶段你的确会编写一些基本的程序,例如打印、求最大值、求最大公约最小公倍数等。 当你把这些简单的程序都写对了,你以为你已经熟练掌握了C++,他们告诉你:“程序=算法+数据结构”。于是你终于知道世界上还有“算法“ 和 ”数据结构“ 这两样东西存在!于是你...
超酷
STL
操作:让你轻松实现集合元素的重新排列
STL
允许在集合上
做
很多
事情
,其
中
之一就是对集合内的元素重新排序。也可以称为对集合执行排列。在集合
中
移动元素通常需要编写大量复杂的代码,涉及
循环
和迭代器。而这也许是
STL
产生最令人瞩目改进的领域,因为它将这些复杂的操作封装在有意义的接口里面。Lexicographical 排列
循环
排列随机排列反向检查排列还有更多的排列方式。在这里,是否涵盖了
STL
允许我们更改集合元素顺序的所有方法?没有!还有其他类型的排列,它们有足够的深度,值得单独写一篇文章。
C++ 语言
65,211
社区成员
250,514
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章