在调用const函数期间,std :: map可以重新平衡吗?

时间:2014-11-11 14:40:53

标签: c++

我有一个const std::map<std::string, std::vector<double>>成员变量和一个函数const std::vector* foo()。我希望这个函数有时会返回一个指向这个地图元素的指针。但是我担心地图可能会重新平衡 - 即使在标记为std::map的{​​{1}}函数期间 - 也会使我返回的指针无效。我知道任何后续的地图修改都会使我的指针无效,但这不会发生,因为我已经标记了成员变量const

我无法有时返回引用,const需要返回foo

我在做什么安全?

3 个答案:

答案 0 :(得分:8)

标准非常清楚:唯一可以失效的东西 迭代器或指针或对地图的引用正在删除 它指向的元素。您甚至可以插入其他元素 没有使指针无效。见§23.2.4/ 9:

  

插入和安置成员不得影响其有效性   迭代器和对容器的引用,以及擦除成员   仅使迭代器和对已擦除元素的引用无效。

答案 1 :(得分:3)

幸运的是,C ++ 11标准明确了这一点:

  

§23.2.2/ 1:

     

为了避免数据竞争(17.6.5.9),实现应该   将以下函数视为const:begin,end,rbegin,   rend,front,back,data,find,lower_bound,upper_bound,equal_range,   在和,除了关联或无序的关联容器,   运算符[]。

所以你很安全。调用map函数时,const无法重新平衡。

答案 2 :(得分:2)

我认为你的意思是&#34; const std :: vector * foo()。&#34;

重新平衡与此无关。答案是你的返回指针不会失效,只要它指向的项目保留在std :: map中(并且地图不会被销毁或移动)。

请注意,std :: map(无论如何都不应该使用 - 请参阅Chandler在CppCon 2014上的演讲:http://youtu.be/fHNmRkzxHWs)一旦将项目添加到容器中,它们将永远不会移动,即使重新平衡。只要该项位于容器中,映射中项的地址就是相同的。这是真的,不考虑重新平衡或添加和/或删除其他项目。