地图中值类型的地址

时间:2013-12-20 19:13:05

标签: c++ map key-value value-type

通常,在std::vector<valuetype>中获取给定值的地址并不安全,因为如果重新分配vector.resize().push_back()扩展大小),向量中所有对象的地址可能会发生变化。

危险:

vector<int> vals ;
vals.push_back( 0 ) ;
int *badP = &vals[0];
vals.push_back( 1 ) ;
// badP could be invalid, if 2nd push_back resulted in realloc

然而,我想知道地图右侧的值类型的安全性。这样安全吗?

危险?

map<int,int> vals ;
vals.insert( make_pair(1,1) ) ;
int *p1 = &vals[1];
// is p1 guaranteed to be valid, as long as the vals[1] 
// is not removed, deleted, or changed?

在什么条件下p1指针错误?

1 个答案:

答案 0 :(得分:1)

来自此处的文档:

http://en.cppreference.com/w/cpp/container/map/insert

  

如果容器尚未包含具有等效键的元素,则将元素插入容器中....   .... 没有迭代器或引用无效

考虑如何实现更改节点不应该影响任何其他节点的值。您需要担心的唯一情况是,如果您从地图中删除该元素。

要处理这种情况,您可以拥有std::map<int, std::shared_ptr<int>>。并存储另一个shared_ptr然后它会非常安全。

编辑:

但请注意,如果你基本上尝试创建一个多接口容器,我强烈推荐使用Boost.MuliIndex库。

http://www.boost.org/doc/libs/1_55_0/libs/multi_index/doc/index.html