【问题标题】:Risk of invalidation of std::array data() in associative container? [duplicate]关联容器中 std::array data() 失效的风险? [复制]
【发布时间】:2016-07-11 18:53:14
【问题描述】:

考虑以下几点:

std::unordered_map<int, std::array<float,50>> foo;
...
auto pointerToArray = foo.at(3).data();

我已阅读 thisthis。我有以下问题:

  • 1) pointerToArray 在引用时属于哪个类别 失效规则、迭代器或引用?
  • 2) pointerToArray 失效的风险是什么 (假设它在foo 中的配对密钥没有被删除)?
  • 3) 这些问题的答案有什么不同(如果有的话) unordered_mapmap 之间的问题?

vector 不同,array 本身不会重新分配,因此不存在自行更改内存地址的风险,但由于它位于无序/映射内部,因此情节变厚了。

更新:发现 another question 表明在这种情况下不存在失效风险。

【问题讨论】:

  • 我很清楚这与使指向结构的指针无效。
  • 您不应该考虑风险。要么有效,要么无效。
  • 我不明白your second link 怎么没有回答你的问题。指向某物的指针与对某物的引用基本相同。
  • @NathanOliver 我想部分混淆是当我在示例中未使用任何 C++ 引用时标准对“引用”一词的使用,因此是我的第一个问题。编辑:我看到您刚刚更改了评论以回答此回复中的问题。
  • @johnbakers 通常一个引用被实现为一个指针。所以你可以在这种情况下互换它们。

标签: c++ c++11


【解决方案1】:

根据您提供的第一个链接所提供的信息,pointerToArray 应该不会因对地图所做的任何后续更改而无效,除非您要从地图中删除元素本身。 std::array&lt;float, 50&gt; 对象将存储在堆中,并且只有指向该对象的指针(或可能引用,取决于 std::unordered_map 的实现方式)将在映射中随机播放。

【讨论】:

    猜你喜欢
    • 2023-04-04
    • 1970-01-01
    • 1970-01-01
    • 2015-05-09
    • 1970-01-01
    • 2019-08-09
    • 1970-01-01
    • 2011-09-23
    • 1970-01-01
    相关资源
    最近更新 更多