1

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

文档说:

侵入式容器不存储传递对象的副本,而是存储对象本身。将对象插入容器所需的附加数据必须由对象本身提供。例如,要插入MyClass实现链表的侵入式容器,MyClass必须包含所需的 next 和 previous 指针:

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

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

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

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

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

4

1 回答 1

0

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

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

请参阅http://www.boost.org/doc/libs/1_38_0/doc/html/intrusive/usage.html以了解这些钩子是如何工作的。有关如何使用多个侵入性 contianers 执行此操作的示例,请参阅此 StackOverflow 答案。

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

于 2013-03-03T19:10:07.767 回答