通常,在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
指针错误?
答案 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