C++ Boost列表的节点结构是什么?
我看不懂Boost列表的节点结构是什么?如果不理解这一点,我就很难理解为什么代码注释中提到插入是(摊销的)恒定时间: 列表是一个双链接列表。也就是说,这是一个序列 支持两者//!向前和向后遍历,以及(摊销) 恒定时间插入和/!在开始时删除元素 或者在最后,或者在中间C++ Boost列表的节点结构是什么?,c++,list,boost,C++,List,Boost,我看不懂Boost列表的节点结构是什么?如果不理解这一点,我就很难理解为什么代码注释中提到插入是(摊销的)恒定时间: 列表是一个双链接列表。也就是说,这是一个序列 支持两者//!向前和向后遍历,以及(摊销) 恒定时间插入和/!在开始时删除元素 或者在最后,或者在中间 插入/删除时,它在已指向插入/删除位置的节点的迭代器上运行 当然,它可以实现恒定的插入/移除时间 更新:我不知道为什么它有“摊销”的固定时间,但你问的是内部节点,在这里 在boost/container/list.hpp中,lis
插入/删除时,它在已指向插入/删除位置的节点的
迭代器上运行
当然,它可以实现恒定的插入/移除时间
更新:我不知道为什么它有“摊销”的固定时间,但你问的是内部节点,在这里
在boost/container/list.hpp
中,list\u节点
定义为:
template<class VoidPointer>
struct list_hook
{
typedef typename container_detail::bi::make_list_base_hook
<container_detail::bi::void_pointer<VoidPointer>, container_detail::bi::link_mode<container_detail::bi::normal_link> >::type type;
};
template <class T, class VoidPointer>
struct list_node
: public list_hook<VoidPointer>::type
{
...
}
因此,它是一个通用\u钩子
,其中循环\u列表\u算法
作为第一个模板参数:
template
< class GetNodeAlgorithms
,...
>
class generic_hook
: ...
, public make_node_holder<GetNodeAlgorithms, Tag, LinkMode, HookType>::type
它是一个详细信息:node\u holder
,类型为GetNodeAlgorithms::type::node
:
template<class Node, class Tag, link_mode_type LinkMode, int>
struct node_holder
: public Node
{};
现在我们看到next_
和prev_
指针
总之,继承树是:
list_node
-> list_hook::type
-> make_list_base_hook::type
-> generic_hook::type
-> make_node_holder::type
-> node_holder
-> Node
其中,Node
的类型为boost::intrusive::list_Node
,它有prev和next指针。插入/删除时,它在一个已指向插入/删除位置的节点的迭代器上运行。然后当然可以实现固定时间的插入/删除。不确定问题是什么。您熟悉固定时间和摊销固定时间之间的区别吗?但是您总是提供位置
迭代器以插入
或擦除
。那么它总是O(1),没有摊销,对吗?还有节点结构呢?我没有看到左右链接。更新了关于节点结构的答案。但有趣的是,为什么它是以固定时间摊销的,我也很好奇:)非常感谢您对节点的解释:)
template<class Node, class Tag, link_mode_type LinkMode, int>
struct node_holder
: public Node
{};
template<class VoidPointer>
struct list_node
{
...
node_ptr next_;
node_ptr prev_;
};
template<class VoidPointer>
struct list_node_traits
{
typedef list_node<VoidPointer> node;
...
}
list_node
-> list_hook::type
-> make_list_base_hook::type
-> generic_hook::type
-> make_node_holder::type
-> node_holder
-> Node