【问题标题】:Confusion about one element in more boost::intrusive containers对更多 boost::intrusive 容器中的一个元素感到困惑
【发布时间】:2013-02-17 17:42:33
【问题描述】:

我不太明白相同的元素怎么可能出现在不同的侵入式容器中,同时又保留boost::intrusive 文档所述的性能和内存使用保证。

文档说:

侵入式容器不存储传递对象的副本,但它 存储对象本身。需要插入的额外数据 容器中的对象必须由对象本身提供。为了 例如,将MyClass 插入一个实现了 链表,MyClass 必须包含需要的下一个和上一个 指点:

class MyClass
{
   MyClass *next;
   MyClass *previous;
   // ...
};

在强调 STL 和 boost::intrusive 容器之间的区别时,文档还说:

非侵入式容器有一些限制:

一个对象只能属于一个容器:如果要在两个容器之间共享一个对象,要么必须存储多个 这些对象的副本,或者您需要使用指针容器: std::list<Object*>.

有道理,一个元素不能在两个std::lists 中。好的。但是如何将一个MyClass 类型的实例插入到两个不同的boost::intrusive::list 中,例如,考虑到这样的元素只能有一个指向下一个元素的指针和一个指向前一个元素的指针。如果我没记错的话,这仅在您假设修改一个容器也可能修改另一个容器时才有效,反之亦然。

【问题讨论】:

  • 我已经有一段时间没有考虑这个问题了,但我很确定 std::list.splice 不推荐使用侵入式列表
  • 前三遍我完全误读了这个问题。

标签: c++ boost boost-intrusive


【解决方案1】:

Boost.Intrusive 库并没有字面意思要求您定义 prevnext 指针——在文档的那部分,prevnext 的存在指针只是侵入式容器如何工作的概念说明。

定义侵入式容器的实际方法是通过继承或作为包含prevnext 指针的成员包含一个钩子。通过包含几个钩子(用不同的静态类型标记),您可以在几个不同的侵入式容器中包含相同的对象(每个都用不同的静态类型标记)。

请参阅http://www.boost.org/doc/libs/1_38_0/doc/html/intrusive/usage.html 了解挂钩的工作原理。请参阅 this StackOverflow answer 以获取有关如何使用多个侵入式容器执行此操作的示例。

这有一些限制——你不能将你的对象包含在运行时定义的任意多个侵入容器中——你必须知道在最初编写它们时要使用哪些容器,并积累知识每一个都放入你的对象中。

【讨论】:

  • 好的。现在很清楚了。我缺少的是“通过包含 几个 钩子”。
  • “定义侵入式容器的实际是通过继承或作为包含 prev 和 next 指针的成员包含一个钩子” - 实际上您还可以实现自定义NodeTraits 和/或ValueTraits处理您希望支持的任何遗留链接方案。所以你可以有一个元素向量和一个pair<index,index> 向量来定义它上面的列表容器。 Boost Intrusive 非常灵活
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-10-16
  • 2017-09-21
  • 2012-06-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多