c++ - 值类型在map中的地址

标签 c++ dictionary key-value value-type

<分区>

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

危险:

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 右侧值类型的安全性。这样安全吗?

危险吗?

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

Inserts element(s) into the container, if the container doesn't already contain an element with an equivalent key.... ....No iterators or references are invalidated

并且考虑如何在节点上更改它不应该影响任何其他节点值。您唯一需要担心的情​​况是您是否从 map 中删除了该元素。

要处理这种情况,您可以使用 std::map<int, std::shared_ptr<int>> .并存储另一个 shared_ptr这样就很安全了。

编辑:

但是请注意,如果您主要是尝试创建一个多接口(interface)容器,我强烈推荐 Boost.MuliIndex 库。

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

关于c++ - 值类型在map中的地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20710458/

相关文章:

c++ - 是否有可能获得指向通用 lambda 显式实例化的指针?

python - 如何在 python 中过滤和打印特定的 json 字典

list - 字典的ansible访问列表

java - 有没有一种方法可以将集合映射到字符串而不创建许多集合实例?

java - 如何使用 Java 中的值列表从 HashMap 中删除值?

prolog - 如何从Prolog中的键值对获取值

c++ - while循环出错?

c++ - Qt:无法在 QMainWindow 中设置布局

c++ - C++中的空指针

java - 从 Main 方法传递参数