C++ 映射中值类型的地址
通常,获取C++ 映射中值类型的地址,c++,map,key-value,value-type,C++,Map,Key Value,Value Type,通常,获取std::vector中给定值的地址是不安全的,因为如果vector重新分配(.resize()或.push_back()扩展大小),向量中所有对象的地址都可能更改 危险: 向量vals; VAL.推回(0); int*badP=&vals[0]; VAL.推回(1); //如果第二次推回导致realloc,则badP可能无效 然而,我想知道地图右侧的值类型的安全性。这安全吗 危险的 map-vals; VAL.插入件(配对(1,1)); int*p1=&vals[1]; //p1是
std::vector
中给定值的地址是不安全的,因为如果vector
重新分配(.resize()
或.push_back()
扩展大小),向量中所有对象的地址都可能更改
危险:
向量vals;
VAL.推回(0);
int*badP=&vals[0];
VAL.推回(1);
//如果第二次推回导致realloc,则badP可能无效
然而,我想知道地图右侧的值类型的安全性。这安全吗
危险的
map-vals;
VAL.插入件(配对(1,1));
int*p1=&vals[1];
//p1是否保证有效,只要VAL[1]
//是否未删除、删除或更改?
在什么情况下,p1
是坏指针?来自此处的文档:
如果容器中尚未包含具有等效键的元素,则将元素插入容器中。。。。
..没有无效的迭代器或引用
并且考虑如何在节点上实现更改不应该影响任何其他节点的值。您需要担心的唯一情况是从映射中删除该元素
要处理这种情况,可以使用std::map
。并存储另一个共享的\u ptr
,这样会非常安全
编辑:
但是,请注意,如果您基本上是在尝试创建一个多接口容器,我强烈推荐Boost.MuliIndex库
所以P1是好的,除非调用vals.erase(1)。
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?