std::map的iterator问题.

weiwuyuan 2013-05-08 09:42:38
std::map<int,int> test;
test[1]=1;
test[2]=2;
test[3]=3;
...

std::map<int,int>::iterator iter = test.find(2);

如果我把这个iter保存下来,那么,当test经历了各种插入删除操作后(key为2的成员没有被修改),这个iter是否还有效?
...全文
596 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
那一年我们21 2013-05-09
  • 打赏
  • 举报
回复
有效 我昨天做个这个类似的
youyou1912 2013-05-08
  • 打赏
  • 举报
回复
如果指向的对象没有被删除, 就一直在那边. 就是不会失效. 对于关联性容器是成立的. 如果你要删除指向的对象, 删除前要后缀++, 是的遍历器保持有效(指向后一个)
引用 12 楼 weiwuyuan 的回复:
[quote=引用 11 楼 supermegaboy 的回复:] 大家说的都不完全,对map进行erase,是有可能发生迭代器失效的,只不过不是任何情况下都失效,例如楼主所举的例子刚好就属于不会失效的情况,什么情况下会呢?例如: erase( pos ); //失效了 pos++; //完蛋了
我的前提是,我指定的key不被删除,删除肯定就失效了[/quote]
weiwuyuan 2013-05-08
  • 打赏
  • 举报
回复
引用 11 楼 supermegaboy 的回复:
大家说的都不完全,对map进行erase,是有可能发生迭代器失效的,只不过不是任何情况下都失效,例如楼主所举的例子刚好就属于不会失效的情况,什么情况下会呢?例如: erase( pos ); //失效了 pos++; //完蛋了
我的前提是,我指定的key不被删除,删除肯定就失效了
飞天御剑流 2013-05-08
  • 打赏
  • 举报
回复
大家说的都不完全,对map进行erase,是有可能发生迭代器失效的,只不过不是任何情况下都失效,例如楼主所举的例子刚好就属于不会失效的情况,什么情况下会呢?例如: erase( pos ); //失效了 pos++; //完蛋了
weiwuyuan 2013-05-08
  • 打赏
  • 举报
回复
恩 我的测试结果也没有失效. 另外,我曾经保存过std::list的iterator,所写的程序也一直没出现什么问题.
snake_xiongyang 2013-05-08
  • 打赏
  • 举报
回复
http://www.cplusplus.com/reference/map/map/ 我一开始也以为要失效 去查了下,楼主可以记住这个网站 结论是 insert No changes. erase Iterators, pointers and references referring to elements removed by the function are invalidated. All other iterators, pointers and references keep their validity. swap All iterators, pointers and references referring to elements in both containers remain valid, but now are referring to elements in the other container, and iterate in it. Note that the end iterators do not refer to elements and may be invalidated.
rocktyt 2013-05-08
  • 打赏
  • 举报
回复
这帖子神了,竟然这么一堆人都在误导。。。 看来只用过vector的人太多了啊
ayrb13 2013-05-08
  • 打赏
  • 举报
回复
引用 6 楼 weiwuyuan 的回复:
[quote=引用 5 楼 ayrb13 的回复:] 你们做过实验么?就讲无效? 绝对是有效的,只有vector,deque,queue此类内存中顺序存储的容器改变才会失效 map是红黑树原理。你们可以去搜搜相关的知识吧,误导人。。。 楼主也可以自己做做实验。
我有测试过,把1和3删掉,再插入,key为2的iter都没有失效[/quote]确实是有效的,可以放心用的,只要节点没有被erase掉,那节点的内容就不会做改变,只是位置会有所变化,再者说,红黑树也是一种二叉树,保存的都是指针。
weiwuyuan 2013-05-08
  • 打赏
  • 举报
回复
引用 5 楼 ayrb13 的回复:
你们做过实验么?就讲无效? 绝对是有效的,只有vector,deque,queue此类内存中顺序存储的容器改变才会失效 map是红黑树原理。你们可以去搜搜相关的知识吧,误导人。。。 楼主也可以自己做做实验。
我有测试过,把1和3删掉,再插入,key为2的iter都没有失效
ayrb13 2013-05-08
  • 打赏
  • 举报
回复
你们做过实验么?就讲无效? 绝对是有效的,只有vector,deque,queue此类内存中顺序存储的容器改变才会失效 map是红黑树原理。你们可以去搜搜相关的知识吧,误导人。。。 楼主也可以自己做做实验。
buyong 2013-05-08
  • 打赏
  • 举报
回复
引用 楼主 weiwuyuan 的回复:
std::map<int,int> test; test[1]=1; test[2]=2; test[3]=3; ... std::map<int,int>::iterator iter = test.find(2); 如果我把这个iter保存下来,那么,当test经历了各种插入删除操作后(key为2的成员没有被修改),这个iter是否还有效?
invalid, you have to use: iter = test.find(2); to refind the pos.
weiwuyuan 2013-05-08
  • 打赏
  • 举报
回复
哦,多谢楼上几位.
nirvana_newbie 2013-05-08
  • 打赏
  • 举报
回复
无效,任何改变容器长度的操作都会使已存在的迭代器失效。
starytx 2013-05-08
  • 打赏
  • 举报
回复
无效了,一般insert等插入数据的操作会导致迭代器失效
taodm 2013-05-08
  • 打赏
  • 举报
回复
楼主,买本《effective stl》吧,这钱省不得。 就别乱上网问,太容易被误导了。
qq120848369 2013-05-08
  • 打赏
  • 举报
回复
很明显有效,因为是树型结构,学C++一定要读《STL源码剖析》,否则把STL当作黑盒使用实在配不上称作“会C++。”
「已注销」 2013-05-08
  • 打赏
  • 举报
回复
必须有效啊。按key迭代的,不是按地址。
xghuzd 2013-05-08
  • 打赏
  • 举报
回复
实践是检验真理的唯一标准。
Qt讷讷熊 2013-05-08
  • 打赏
  • 举报
回复
引用 5 楼 ayrb13 的回复:
你们做过实验么?就讲无效? 绝对是有效的,只有vector,deque,queue此类内存中顺序存储的容器改变才会失效 map是红黑树原理。你们可以去搜搜相关的知识吧,误导人。。。 楼主也可以自己做做实验。
支持, 不过另几位讲的原则是对的. LZ如果能了解到这程度,自然连这个问题都不会问了
ayrb13 2013-05-08
  • 打赏
  • 举报
回复
引用 11 楼 supermegaboy 的回复:
大家说的都不完全,对map进行erase,是有可能发生迭代器失效的,只不过不是任何情况下都失效,例如楼主所举的例子刚好就属于不会失效的情况,什么情况下会呢?例如: erase( pos ); //失效了 pos++; //完蛋了
这位同学,谁会这么用啊? 不必举这样的例子的,大家应该都知道应该怎么循环删除吧

64,652

社区成员

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

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