gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 10:06:45 34 4
gpt4 key购买 nike

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

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com