在多个boost::侵入式容器中混淆一个元素
Confusion about one element in more boost::intrusive containers
我不太明白为什么相同的元素可以出现在不同的侵入性容器中,同时保持boost::intrusive
文档所述的性能和内存使用保证。
文档说:
侵入式容器不存储传入对象的副本,而存储传入对象的副本存储对象本身。需要插入的其他数据容器中的对象必须由对象本身提供。为例如,将
MyClass
插入到实现a的侵入性容器中链表中,MyClass
必须包含所需的next和previous指针:
class MyClass
{
MyClass *next;
MyClass *previous;
// ...
};
在强调STL和boost::侵入式容器之间的区别时,文档还说:
非侵入式容器有一些限制:一个对象只能属于一个容器:如果你想在两个容器之间共享一个对象,你必须存储多个这些对象的副本,或者你需要使用指针容器:
std::list<Object*>
.
有意义,一个元素不能在两个std::list
中。好吧。但是,考虑到这样一个元素只能有一个指向下一个元素的指针和一个指向前一个元素的指针,如何将类型MyClass
的一个实例插入到两个不同的boost::intrusive::list
中呢?如果我没有错的话,这只适用于假设修改一个容器也可以修改另一个容器,反之亦然。
侵入式库并不要求你定义prev
和next
指针——在文档的那一部分,prev
和next
指针的存在仅仅是对侵入式容器如何工作的一个概念性说明。
定义侵入性容器的实际方法是通过继承或作为包含prev
和next
指针的成员包含钩子。通过包含几个钩子(用不同的静态类型标记),你可以在几个不同的侵入性容器中包含相同的对象(每个容器都用不同的静态类型标记)。
请参阅http://www.boost.org/doc/libs/1_38_0/doc/html/intrusive/usage.html了解钩子的工作原理。关于如何在多个侵入式容器中做到这一点,请参阅StackOverflow的答案。
这有一些限制——你不能将你的对象包含在运行时定义的任意多个侵入性容器中——你必须在最初编码时知道你想要使用哪些容器,并将每个容器的知识构建到你的对象中。
- lower_bound()返回最后一个元素
- 基于范围的 for 循环:迭代使用一个元素扩展的向量
- 使用运算符 [] 引用 std::vector 上最后一个元素时出现问题<>
- Lower_bound不适用于具有 3 个元素的向量的最后一个元素
- 检查 2D 网格的某个元素是否与另一个元素共享对角线、水平线或垂直线
- 仅显示链表的最后一个元素
- push_back通过自行创建的对象获取最后一个元素的向量
- 使用 map.end() 访问 map 的最后一个元素
- 如何知道地图中的最后一个元素是否被删除?
- 选择一个元素而不是一个对象的数组的原因
- std::矢量保存 只推送最后一个元素
- 为什么这个选择排序算法仍然切换一个元素,当它已经是其他元素中最小的元素时?
- 反转后不返回最后一个元素
- 如何在新数组较小时创建新数组并将旧数组的最后一个元素复制到新数组中?
- 访问 for_each 函数中的前一个元素
- 在 QListView 中显示最后一个元素
- 从 std::vector 中选择一个元素,而不是给定元素
- C++:在进行切片时对迭代器的约定,特别是对于访问最后一个元素并最终将其删除
- 遍历列表包含排除最后一个元素的内容
- 如何从一个无序集合中获取一个元素