我可以有一个C++映射,其中多个键引用该值而不使用指针吗
Can I have a C++ map where multiple keys reference the value without using pointers?
在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"answers"c"将显示更新的结果。
否,您需要为此使用指针。映射中的每个条目都维护指定值的副本,这意味着不能有两个键引用同一元素。现在,如果存储指向元素的指针,那么两个键将引用两个单独的指针,这两个指针将引用内存中完全相同的元素。
对于一些实现细节,std::map
被实现为一个平衡树,其中在每个节点中都包含一个std::pair<const Key,Value>
对象(以及树结构的额外信息)。执行m[ key ]
时,将查找包含关键字的节点,或者在树中创建一个新节点,并返回对该对的Value
子对象的引用。
我会在这里使用std::shared_ptr
。您有一个共享所有权的示例,shared_ptr
就是为此而设计的。虽然指针往往被过度使用,但在必要时使用它们并没有错。
Boost.Intrusive
Intrusive是一个库,它向C++的世界。侵入性容器是指提供比非侵入性容器(如STL容器)。
侵入式容器的性能优势使它们成为构建块,以有效构建复杂的容器,如多索引容器或设计类似内存的高性能代码分配算法。
虽然侵入式容器过去和现在都在C中广泛使用,但它们变成了由于标准的存在,C++中越来越被遗忘不支持侵入性技术的容器。Boost.Intrusive不仅将此技术重新引入C++,而且还封装了在类似STL的接口中实现。因此,任何熟悉标准容器可以轻松使用Boost.Intrusive.
- 如何使用基类指针引用派生类成员
- 将常量指针引用绑定到非常量指针
- 如果非动态变量被指针引用,何时超出范围?
- 转换指针引用的字符串
- 指针引用的生存期(以 C++为单位)
- 从 unique_ptr::get 发送指针作为指针引用进入函数
- 指针/引用的 CLion 格式
- 使用模板专用化来比较指针引用
- 如何保存指向抽象基类的指针/引用,但在 c++ 中仍然可以复制
- C++初始化指针/引用/复制细微差别
- 用数组或指针引用函数?
- 指针范围问题和返回类中封装的指针向量内的指针引用
- 强制转换为指针引用是否会导致未定义的行为
- 访问由 void 指针引用的结构的成员
- C 为什么当先前的步骤引发异常时,std :: shared_ptr的指针引用会被破坏
- 动态指针引用数组由三元运算符返回值,但有异常
- 悬空指向 int 和 char* 常量的指针/引用
- C++ 二维数组和指针引用
- 通过使用指针/引用,在C++中使用向量加快计算速度
- C++非类型模板模板到函数指针/引用