我可以使用C ++映射,其中多个键引用值而不使用指针吗?

时间:2012-03-28 20:37:51

标签: c++ stl map

从C背景来看,我发现自己又回到了C习惯,通常有更好的方式。在这种情况下,如果没有指针,我无法想到一种方法。

我想

struct foo {
    int i;
    int j;
};

mymap['a'] = foo
mymap['b'] = bar

只要只有一个键引用一个值mymap.find就会返回一个引用,所以我可以修改该值,但如果我这样做:

mymap['c'] = mymap.find('a') // problematic because foo is copied right?

目标是能够找到'a'或'c'修改foo,然后下一个'a'或'c'的查找将显示更新的结果。

3 个答案:

答案 0 :(得分:3)

不,你需要使用指针。地图中的每个条目都维护分配值的副本,这意味着您不能有两个引用相同元素的键。现在,如果存储指向元素的指针,那么两个键将引用两个单独的指针,这些指针将引用内存元素中的完全相同。

对于某些实现细节,std::map实现为平衡树,其中每个节点包含一个std::pair<const Key,Value>对象(以及树结构的额外信息)。当您m[ key ]查找包含密钥的节点或在树中创建新节点时,将返回对该Value子对象的引用。

答案 1 :(得分:2)

我会在这里使用std::shared_ptr。您有一个共享所有权的示例,并为此制作了shared_ptr。虽然指针往往被过度使用,但在必要时使用它们并没有错。

答案 2 :(得分:0)

Boost.Intrusive

  

Boost.Intrusive是一个展示一些侵入式容器的库   C ++的世界。侵入式容器是特殊的容器   提供更好的性能和异常安全保证   非侵入式容器(如STL容器)。

     

侵入式容器的性能优势使其成为理想的选择   积木有效地构建复杂的容器,如   多索引容器或设计高性能代码,如内存   分配算法。

     

虽然侵入性容器在C中被广泛使用,但它们变成了   由于标准的存在,越来越多的人忘记了C ++   不支持侵入式技术的容器.Boost.Intrusive   不仅将这种技术重新引入C ++,还封装了   在类似STL的接口中实现。因此任何熟悉的人   标准容器可以轻松使用Boost.Intrusive。