Из того, что я знаю, сращивание должно вырезать кусок из одного списка и поместить его в другой. Я не понимаю, для чего предназначен следующий код (взят из 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 обрезается с обоих концов и нигде не заканчивается.
Посмотрите, как это используется:
// 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
это член, и это заканчивается именно там, где это началось.
Других решений пока нет …