【问题标题】:Address of value type in map [duplicate]映射中值类型的地址[重复]
【发布时间】:2013-12-20 19:13:04
【问题描述】:

通常在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 是一个坏指针?

【问题讨论】:

标签: c++ map key-value value-type


【解决方案1】:

来自这里的文档:

http://en.cppreference.com/w/cpp/container/map/insert

如果容器还没有包含具有等效键的元素,则将元素插入容器中...... ....没有迭代器或引用无效

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

要处理这种情况,您可以使用std::map&lt;int, std::shared_ptr&lt;int&gt;&gt;。再存储一个shared_ptr 就很安全了。

编辑:

但是,请注意,如果您基本上尝试创建多接口容器,我强烈推荐 Boost.MuliIndex 库。

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

【讨论】:

    猜你喜欢
    • 2021-11-26
    • 2014-12-31
    • 2020-12-06
    • 1970-01-01
    • 2013-07-28
    • 2013-06-21
    • 1970-01-01
    • 2020-07-21
    • 2013-09-18
    相关资源
    最近更新 更多