【问题标题】:std::unordered_map pointers/reference invalidationstd::unordered_map 指针/引用失效
【发布时间】:2016-10-05 08:11:45
【问题描述】:

我有以下代码:

std::unordered_map<std::string, std::string> map;

map["k1"] = "v1";
auto& v1 = map["k1"];
map["k2"] = "v2";

看完http://en.cppreference.com/w/cpp/container/unordered_map

注意事项

交换函数不会使容器内的任何迭代器失效,但它们会使标记交换区域结束的迭代器失效。

对存储在容器中的键或数据的引用和指针只有通过擦除该元素才会失效,即使相应的迭代器失效也是如此。

看起来v1 在插入新值后可以安全使用,即使在插入过程中可能会发生重新散列。

我对这句话的理解正确吗?修改地图后,我可以使用地图中值的引用/指针吗(显然删除值本身会使引用/指针无效)?

【问题讨论】:

  • 是的,你是对的。也见here

标签: c++ c++11 language-lawyer unordered-map


【解决方案1】:

看起来v1 在插入新值后可以安全使用,即使在插入过程中可能会发生重新散列。

是的,std::unordered_map::operator[] 不会使引用无效,甚至会发生重新散列。

(强调我的)

如果发生插入并导致容器重新散列,则所有迭代器都将失效。否则迭代器不受影响。 引用不会失效

来自标准,[unord.req]/9

(强调我的)

重新散列使迭代器无效、更改元素之间的顺序以及更改元素出现在哪些桶中,但不会使指针或元素引用无效

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-01
    • 2021-09-26
    • 1970-01-01
    • 2019-01-15
    • 2021-12-23
    • 1970-01-01
    相关资源
    最近更新 更多