0

据我所知,拼接应该从一个列表中剪下一块并将其放入另一个列表中。我不明白以下代码的用途(取自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 的两端都被切断了,并且没有在任何地方结束。

4

1 回答 1

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参数不是一个真正的节点,它是 a node_base,这意味着它不包含任何数据,它只是一个指向第一个元素的指针,所以它不会被“切断”,因为它仍然是slist它的成员,并且它在它开始的地方结束。

于 2013-09-20T15:14:27.677 回答