c++ - Boost.Intrusive Containers - 不同大小的元素

标签 c++ boost intrusive-containers boost-intrusive

在“何时使用?”一章的 Boost.Intrusive 文档中https://www.boost.org/doc/libs/1_72_0/doc/html/intrusive/usage_when.html ,据说您可以使用包含不同或未知大小的物体的侵入式容器。

#include <boost/intrusive/list.hpp>

using namespace boost::intrusive;

//An abstract class that can be inserted in an intrusive list
class Window : public list_base_hook<>
{
   public:
   //This is a container those value is an abstract class: you can't do this with std::list.
   typedef list<Window> win_list;

   //A static intrusive list declaration
   static win_list all_windows;

   //Constructor. Includes this window in the list
   Window()             {  all_windows.push_back(*this);  }
   //Destructor. Removes this node from the list
   virtual ~Window()    {  all_windows.erase(win_list::s_iterator_to(*this));  }
   //Pure virtual function to be implemented by derived classes
   virtual void Paint() = 0;
};

//The static intrusive list declaration
Window::win_list Window::all_windows;

//Some Window derived classes
class FrameWindow :  public Window
{  void Paint(){/**/} };

class EditWindow :  public Window
{  void Paint(){/**/} };

class CanvasWindow :  public Window
{  void Paint(){/**/} };

//A function that prints all windows stored in the intrusive list
void paint_all_windows()
{
   for(Window::win_list::iterator i(Window::all_windows.begin())
                                , e(Window::all_windows.end())
      ; i != e; ++i)
      i->Paint();
}

//...

//A class derived from Window
class MainWindow  :  public Window
{
   FrameWindow   frame_;  //these are derived from Window too
   EditWindow    edit_;
   CanvasWindow  canvas_;

   public:
   void Paint(){/**/}
   //...
};

//Main function
int main()
{
   //When a Window class is created, is automatically registered in the global list
   MainWindow window;

   //Paint all the windows, sub-windows and so on
   paint_all_windows();

   //All the windows are automatically unregistered in their destructors.
   return 0;
}

我的问题是我不明白什么时候有人需要它(使用示例?)。而且我不明白给定示例中的哪个部分显示了这种行为,以及为什么不能使用标准容器执行此操作。

最佳答案

My problem is that I don't understand when someone would need that



他们测量了他们的程序的性能,发现使用 std::vector<Window *> 的速度变慢了。超过这个是 Not Acceptable 。给定的示例显示了“如何”,它不是“何时”的示例。

And I dont understand which part in the given example shows this behaviour and why you cannot do this with standard containers.



你不能有 std::vector<Window> (也不是 std::list<Window> 等),因为 Window是一种抽象类型。 std::容器拥有Window它们包含的对象,为它们分配了空间。

侵入性列表有效,因为 boost::intrusive::list_base_hook base 包含 prev/next 指针,而 objects 包含 hook。这意味着 Window对象可以存在于任何地方,例如在 mainMainWindow window 为例它是成员(member)Windows .

关于c++ - Boost.Intrusive Containers - 不同大小的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59862731/

相关文章:

c++ - 一个侵入性的 unique_ptr 列表?

c++ - Boost Intrusive unordered_set 在 C++11 模式下使用 GCC 在 1.48 中被破坏

c++ - 类/结构定义错误

C++ 线程安全对象

CMake 上的 Boost_DIR-NOTFOUND

c++ - 自己的 AddRef 和 Release for Boost shared_ptr

C++ OpenMP 并行 For 循环 - std::vector 的替代品

c++ - makefile 和多文件 C++ 模板问题

c++ - 如何在没有new的情况下在派生对象中使用虚函数?

c++ - cin 抛出错误信息