Я подозреваю, что вы неправильно прочитали несколько тонкую спецификацию диапазона, в которой говорится, что "(first, last)" перемещено, not"[first, last)" (обратите внимание на открывающую скобку / скобку). То есть, как видно из названия, операция сращивания начинается только после первого объекта.
Реализация функции на самом деле довольно проста (если вы игнорируете постоянство итераторов и тот факт, что может потребоваться иметь дело с другими распределителями):
void splice_after(const_iterator pos, forward_list& other,
const_iterator first, const_iterator last) {
node* f = first._Node->_Next;
node* p = f;
while (p->_Next != last._Node) { // last is not included: find its predecessor
p = p->_Next;
}
first._Node->Next = last._Node; // remove nodes from this
p->_Next = pos._Node->_Next; // hook the tail of the other list onto last
pos._Node->_Next = f; // hook the spliced elements onto pos
}
Эта операция имеет линейную сложность, потому что ей нужно найти предшественника last
.