【问题标题】:Does address of an unordered_map::iterator->first change upon subequent insertions & deletions? [duplicate]unordered_map::iterator->first 的地址是否会在后续插入和删除时发生变化? [复制]
【发布时间】:2016-02-19 01:54:35
【问题描述】:

一旦一个键值对被插入到一个 unordered_map 并且假设 iter 指向这个对,&iter->first 在这个对存在于 unordered_map 的整个生命周期中是否会保持不变?

键大多是长字符串,所以我想将它们的迭代器->first 的地址存储在其他引用位置,而不是字符串本身。

【问题讨论】:

  • 您好 PreferenceBean,我浏览了您在此处发布的链接。我确实看到了相关部分“未排序的关联容器:unordered_[multi]{set,map}:所有迭代器在重新散列时都无效,但引用不受影响 [23.2.5/8]。”这确实回答了我的问题。请建议我是否需要在这篇文章中采取任何进一步的行动。

标签: c++ iterator unordered-map


【解决方案1】:

没关系,除非你直接删除元素。

对于std::unordered_map::insert

如果由于插入而发生重新散列,则所有迭代器都将失效。否则迭代器不受影响。 引用不会失效。仅当新元素数大于 max_load_factor()*bucket_count() 时才会发生重新散列。

对于std::unordered_map::erase

对已擦除元素的引用和迭代器无效。 其他迭代器和引用不会失效

【讨论】:

  • 是的,我知道重新散列会导致迭代器失效,但是键是否也重新分配了?分配的新迭代器不是指向内存中相同的键实例,它再次作为迭代器->第一个返回吗?
  • @vrk001 我的错。我误解了你的问题。我修改了答案。
猜你喜欢
  • 2012-05-18
  • 2017-11-26
  • 2016-01-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-06
  • 1970-01-01
相关资源
最近更新 更多