关联容器中的 std::array data() 失效的风险

Risk of invalidation of std::array data() in associative container?

本文关键字:失效 data array std 关联      更新时间:2023-10-16

请考虑以下事项:

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

我读过这个和这个。我有以下问题:

  • 1)pointerToArray在提到无效规则、迭代器还是引用?
  • 2)pointerToArray被失效的风险是什么(假设它在foo中的配对密钥没有被删除)?
  • 3)这些问题的答案有什么区别(如果有的话)unordered_mapmap之间的问题?

vector不同,array本身不会重新分配,因此它不会自行更改内存地址,但是由于它在无序/映射中,绘图会变厚。

更新:发现了另一个问题,表明在这种情况下没有无效的风险。

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