1

在“何时使用?”一章的 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;
}

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

4

1 回答 1

2

我的问题是我不明白什么时候有人需要

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

而且我不明白给定示例中的哪个部分显示了这种行为,以及为什么你不能用标准容器做到这一点。

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

侵入式列表之所以有效,是因为boost::intrusive::list_base_hook基类包含 prev / next 指针,而对象包含钩子。这意味着Window对象可以存在于任何地方,例如在main示例中MainWindow window,它是 member Windows

于 2020-01-22T17:13:37.747 回答