Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/133.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 映射中值类型的地址_C++_Map_Key Value_Value Type - Fatal编程技术网

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?