在没有容器的情况下检查 boost::intrusive::list 中的列表结尾?
Check for end-of-list in boost::intrusive::list without container?
我刚开始接触Boost.Intrusive,对双向链表特别感兴趣(boost::intrusive::list
)。
这在“手动”链表中是微不足道的,但到目前为止我找不到等效的 Boost:
给定一个属于列表的节点,我如何检查它是否代表列表的末尾,而不需要拥有容器。
在手工制作的列表中,这就像检查“下一个”指针是否为 NULL 一样简单。
有了boost::intrusive::list
,就有了s_iterator_to
函数,将普通节点转换为迭代器。您可以对照 mylist.end()
检查它,这会给出所需的结果,但它需要对列表容器本身的引用。
我还注意到,在这样的迭代器上使用 operator++
只会在它移过末尾时产生垃圾值——没有错误或来自 Boost 的断言。
经过更多的研究和思考,似乎没有办法用标准 boost::intrusive::list
功能做我想做的事。
提供的列表实际上是一个循环链表,而不是线性链表。所以,最后没有“空指针”。
该实现似乎遵循与 Linux 内核的 list.h
类似的设计。您始终需要对容器对象的引用,因为它包含循环列表的“头部”,这是一个不包含用户数据的特殊节点。这也是遍历时代表end()
的节点
至于为什么选择这个设计,我还没有找到任何确凿的证据。看起来,循环列表设计允许更简单的实现,分支更少。参见,例如,this old article,它说“列表的循环性质使得插入和删除节点变得简单且无分支。”
我并不完全相信这一点,因为我认为使用“指针到指针”风格的处理也可以避免分支。但这就是 boost::intrusive::list
中完成的方式,无论如何。
我刚开始接触Boost.Intrusive,对双向链表特别感兴趣(boost::intrusive::list
)。
这在“手动”链表中是微不足道的,但到目前为止我找不到等效的 Boost:
给定一个属于列表的节点,我如何检查它是否代表列表的末尾,而不需要拥有容器。
在手工制作的列表中,这就像检查“下一个”指针是否为 NULL 一样简单。
有了boost::intrusive::list
,就有了s_iterator_to
函数,将普通节点转换为迭代器。您可以对照 mylist.end()
检查它,这会给出所需的结果,但它需要对列表容器本身的引用。
我还注意到,在这样的迭代器上使用 operator++
只会在它移过末尾时产生垃圾值——没有错误或来自 Boost 的断言。
经过更多的研究和思考,似乎没有办法用标准 boost::intrusive::list
功能做我想做的事。
提供的列表实际上是一个循环链表,而不是线性链表。所以,最后没有“空指针”。
该实现似乎遵循与 Linux 内核的 list.h
类似的设计。您始终需要对容器对象的引用,因为它包含循环列表的“头部”,这是一个不包含用户数据的特殊节点。这也是遍历时代表end()
的节点
至于为什么选择这个设计,我还没有找到任何确凿的证据。看起来,循环列表设计允许更简单的实现,分支更少。参见,例如,this old article,它说“列表的循环性质使得插入和删除节点变得简单且无分支。”
我并不完全相信这一点,因为我认为使用“指针到指针”风格的处理也可以避免分支。但这就是 boost::intrusive::list
中完成的方式,无论如何。