关于更多boost :: intrusive容器中的一个元素的混淆

时间:2013-03-03 16:42:59

标签: c++ boost boost-intrusive

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

文档说:

  

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

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

当强调STL和boost :: intrusive容器之间的差异时,文档还说:

  

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

     

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

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

1 个答案:

答案 0 :(得分:0)

Boost.Intrusive库 litterally 要求您定义prevnext指针 - 在文档的那一部分中,{{1}的存在}}和prev指针仅仅是侵入容器如何工作的概念性说明。

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

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

这有一些限制 - 您不能将对象包含在运行时定义的任意多个侵入式容器集中 - 您必须知道在最初编码时要使用的容器,并构建知识每一个都进入你的对象。