映射中值类型的地址

Address of value type in map

本文关键字:地址 类型 映射      更新时间:2023-10-16

一般来说,在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是一个糟糕的指针?

从这里的文档:

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

相关文章: