libstdc ++ Splice函数的含义或用途

时间:2013-09-20 07:24:00

标签: c++ singly-linked-list libstdc++ splice

据我所知,拼接应该从一个列表中删除一个并将其放入另一个列表中。我不明白以下代码是什么(取自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在两端被切断,并且不会在任何地方结束。

1 个答案:

答案 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中,但它最终会在它开始的地方结束。