unordered_map::iterator->first 的地址是不是会在后续插入和删除时发生变化? [复制]

Posted

技术标签:

【中文标题】unordered_map::iterator->first 的地址是不是会在后续插入和删除时发生变化? [复制]【英文标题】: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]。”这确实回答了我的问题。请建议我是否需要在这篇文章中采取任何进一步的行动。 【参考方案1】:

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

对于std::unordered_map::insert

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

对于std::unordered_map::erase

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

【讨论】:

是的,我知道重新散列会导致迭代器失效,但是键是否也重新分配了?分配的新迭代器不是指向内存中相同的键实例,它再次作为迭代器->第一个返回吗? @vrk001 我的错。我误解了你的问题。我修改了答案。

以上是关于unordered_map::iterator->first 的地址是不是会在后续插入和删除时发生变化? [复制]的主要内容,如果未能解决你的问题,请参考以下文章