据我所知,拼接应该从一个列表中删除一个并将其放入另一个列表中。我不明白以下代码是什么(取自http://gcc.gnu.org/onlinedocs/libstdc++/latest-doxygen/a01477_source.html第112行,我正在阅读的一些标准库,以便更好地理解各种数据结构):
inline void
__slist_splice_after(_Slist_node_base* __pos, _Slist_node_base* __head)
{
_Slist_node_base* __before_last = __slist_previous(__head, 0);
if (__before_last != __head)
{
_Slist_node_base* __after = __pos->_M_next;
__pos->_M_next = __head->_M_next;
__head->_M_next = 0;
__before_last->_M_next = __after;
}
}
似乎__head在两端被切断,并且不会在任何地方结束。
答案 0 :(得分:0)
看看它是如何使用的:
// Removes all of the elements from the list __x to *this, inserting
// them immediately after __pos. __x must not be *this. Complexity:
// linear in __x.size().
void
splice_after(iterator __pos, slist& __x)
{ __slist_splice_after(__pos._M_node, &__x._M_head); }
看看如何声明_M_head
:
_Slist_node_base _M_head;
所以__head
参数不是真正的节点,它是node_base
,这意味着它不包含任何数据,它只是指向第一个元素的指针,所以它不会得到“切断”,因为它仍然在slist
中,但它最终会在它开始的地方结束。