multimap 的一些pair的键改变后,之前的iterator还管用么

shouso888 2014-03-10 10:04:23
比如: multimap<int, SomeObject>;

我保存了一些 SomeObject 在multimap中的位置的 iterator;
然后我更改了 multimap 中多个pair的键int的数值。

问题是: 之前保存的那些 iterator 所指向的pair中的 SomeObject 还是原来那个么?
这个用法有点扭...但不要讨论我为什么会这么用了。我只想知道那些iterator的pair中还
是原来的 SomeObject不?
...全文
155 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2014-03-13
  • 打赏
  • 举报
回复
引用 9 楼 shouso888 的回复:
[quote=引用 8 楼 zhao4zhong1 的回复:] 我的纸质通讯录的一些人的名字改变后,之前的目录还管用么 ?
这么说的话,管用。[/quote] 在目录没有随之更新的前提下,查询的人不是刚改过名字的人时才管用亲。
FancyMouse 2014-03-13
  • 打赏
  • 举报
回复
引用 10 楼 shouso888 的回复:
[quote=引用 5 楼 FancyMouse 的回复:] [quote=引用 3 楼 shouso888 的回复:] [quote=引用 1 楼 FancyMouse 的回复:] 你改someobject随便改。你如果是通过iterator::first去改的int,那整个map都坏掉了,你在关心iterator失效以前你先去关心你这map本身还有效没。你要是erase+insert去改得int,那map没坏,但是iterator就无效了。
是的,如果是通过iterator::first去改的int,编译不过,因为 first 是只读的。 那我这样,如果我之前保留了 SomeObject 对象 A, B 在multimap<int, SomeObject>中 的 iterator, 然后 像你上边说的 对A 进行erase + insert,接着修改A在multimap的 iterator。 这样, 对象 A, B 在multimap<int, SomeObject>中 的 iterator 都还是有效的。这样可以吧?[/quote] erase/insert返回的iterator有效,但是那次操作以后你手上的所有其他iterator都不一定有效了。你erase掉A的时候B的iterator已经可能无效了。接下来也没什么说的了。[/quote] 你说“erase/insert返回的iterator有效,但是那次操作以后你手上的所有其他iterator都不一定有效了。” ,经过测试,其它的还是有效的,但还没有理论支撑。猜测:其它还管用。[/quote] 这点好像你真是对的。再看了下文档,map/set这类东西,insert还真不会把已有的iterator给invalidate掉。看来实现上没有难点的地方标准就直接规定掉了。这挺好。
shouso888 2014-03-13
  • 打赏
  • 举报
回复
引用 5 楼 FancyMouse 的回复:
[quote=引用 3 楼 shouso888 的回复:] [quote=引用 1 楼 FancyMouse 的回复:] 你改someobject随便改。你如果是通过iterator::first去改的int,那整个map都坏掉了,你在关心iterator失效以前你先去关心你这map本身还有效没。你要是erase+insert去改得int,那map没坏,但是iterator就无效了。
是的,如果是通过iterator::first去改的int,编译不过,因为 first 是只读的。 那我这样,如果我之前保留了 SomeObject 对象 A, B 在multimap<int, SomeObject>中 的 iterator, 然后 像你上边说的 对A 进行erase + insert,接着修改A在multimap的 iterator。 这样, 对象 A, B 在multimap<int, SomeObject>中 的 iterator 都还是有效的。这样可以吧?[/quote] erase/insert返回的iterator有效,但是那次操作以后你手上的所有其他iterator都不一定有效了。你erase掉A的时候B的iterator已经可能无效了。接下来也没什么说的了。[/quote] 你说“erase/insert返回的iterator有效,但是那次操作以后你手上的所有其他iterator都不一定有效了。” ,经过测试,其它的还是有效的,但还没有理论支撑。猜测:其它还管用。
shouso888 2014-03-13
  • 打赏
  • 举报
回复
引用 8 楼 zhao4zhong1 的回复:
我的纸质通讯录的一些人的名字改变后,之前的目录还管用么 ?
这么说的话,管用。
赵4老师 2014-03-12
  • 打赏
  • 举报
回复
我的纸质通讯录的一些人的名字改变后,之前的目录还管用么 ?
buyong 2014-03-12
  • 打赏
  • 举报
回复
引用 楼主 shouso888 的回复:
比如: multimap<int, SomeObject>; 我保存了一些 SomeObject 在multimap中的位置的 iterator; 然后我更改了 multimap 中多个pair的键int的数值。 问题是: 之前保存的那些 iterator 所指向的pair中的 SomeObject 还是原来那个么? 这个用法有点扭...但不要讨论我为什么会这么用了。我只想知道那些iterator的pair中还 是原来的 SomeObject不?
都失效了
  • 打赏
  • 举报
回复
map中已有的元素的类型是pair<const Type1, Type2>,因此无法改变键的值 如果键是一个结构,则可以用mutable关键字修饰成员变量,使其在常量下可写 删除并重建的方法: 在迭代器的循环中删除元素要得其法,否则会使迭代器无效。 但是删除后紧接着重建就不太好了,删除后可以记录起来,循环结束后再重建
FancyMouse 2014-03-12
  • 打赏
  • 举报
回复
引用 3 楼 shouso888 的回复:
[quote=引用 1 楼 FancyMouse 的回复:] 你改someobject随便改。你如果是通过iterator::first去改的int,那整个map都坏掉了,你在关心iterator失效以前你先去关心你这map本身还有效没。你要是erase+insert去改得int,那map没坏,但是iterator就无效了。
是的,如果是通过iterator::first去改的int,编译不过,因为 first 是只读的。 那我这样,如果我之前保留了 SomeObject 对象 A, B 在multimap<int, SomeObject>中 的 iterator, 然后 像你上边说的 对A 进行erase + insert,接着修改A在multimap的 iterator。 这样, 对象 A, B 在multimap<int, SomeObject>中 的 iterator 都还是有效的。这样可以吧?[/quote] erase/insert返回的iterator有效,但是那次操作以后你手上的所有其他iterator都不一定有效了。你erase掉A的时候B的iterator已经可能无效了。接下来也没什么说的了。
qq120848369 2014-03-11
  • 打赏
  • 举报
回复
先erase掉再Insert回去才行呢。
shouso888 2014-03-11
  • 打赏
  • 举报
回复
引用 1 楼 FancyMouse 的回复:
你改someobject随便改。你如果是通过iterator::first去改的int,那整个map都坏掉了,你在关心iterator失效以前你先去关心你这map本身还有效没。你要是erase+insert去改得int,那map没坏,但是iterator就无效了。
是的,如果是通过iterator::first去改的int,编译不过,因为 first 是只读的。 那我这样,如果我之前保留了 SomeObject 对象 A, B 在multimap<int, SomeObject>中 的 iterator, 然后 像你上边说的 对A 进行erase + insert,接着修改A在multimap的 iterator。 这样, 对象 A, B 在multimap<int, SomeObject>中 的 iterator 都还是有效的。这样可以吧?
xiaohuh421 2014-03-11
  • 打赏
  • 举报
回复
你把multimap想成是一个列表, 而iterator是一个指向列表中某一项的指针就好了.
FancyMouse 2014-03-11
  • 打赏
  • 举报
回复
你改someobject随便改。你如果是通过iterator::first去改的int,那整个map都坏掉了,你在关心iterator失效以前你先去关心你这map本身还有效没。你要是erase+insert去改得int,那map没坏,但是iterator就无效了。

64,654

社区成员

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

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