Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/131.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Boost列表的节点结构是什么?_C++_List_Boost - Fatal编程技术网

C++ Boost列表的节点结构是什么?

C++ Boost列表的节点结构是什么?,c++,list,boost,C++,List,Boost,我看不懂Boost列表的节点结构是什么?如果不理解这一点,我就很难理解为什么代码注释中提到插入是(摊销的)恒定时间: 列表是一个双链接列表。也就是说,这是一个序列 支持两者//!向前和向后遍历,以及(摊销) 恒定时间插入和/!在开始时删除元素 或者在最后,或者在中间 插入/删除时,它在已指向插入/删除位置的节点的迭代器上运行 当然,它可以实现恒定的插入/移除时间 更新:我不知道为什么它有“摊销”的固定时间,但你问的是内部节点,在这里 在boost/container/list.hpp中,lis

我看不懂Boost列表的节点结构是什么?如果不理解这一点,我就很难理解为什么代码注释中提到插入是(摊销的)恒定时间:

列表是一个双链接列表。也就是说,这是一个序列 支持两者//!向前和向后遍历,以及(摊销) 恒定时间插入和/!在开始时删除元素 或者在最后,或者在中间


插入/删除时,它在已指向插入/删除位置的节点的
迭代器上运行

当然,它可以实现恒定的插入/移除时间


更新:我不知道为什么它有“摊销”的固定时间,但你问的是内部节点,在这里

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
,它有prevnext指针。

插入/删除时,它在一个已指向插入/删除位置的节点的
迭代器上运行。然后当然可以实现固定时间的插入/删除。不确定问题是什么。您熟悉固定时间和摊销固定时间之间的区别吗?但是您总是提供
位置
迭代器以
插入
擦除
。那么它总是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