Читая о forward_list
в FCD C ++ 11 и N2543 Я наткнулся на одну конкретную перегрузку splice_after
(немного упрощен, и пусть cit
будет const_iterator
):
void splice_after(cit pos, forward_list& x, cit first, cit last);
Поведение таково, что после pos
все между (первый, последний)
перемещается в this
. Таким образом:
this: 1 2 3 4 5 6 x: 11 12 13 14 15 16
^pos ^first ^last
will become:
this: 1 2 13 14 3 4 5 6 x: 11 12 15 16
^pos ^first ^last
Описание включает сложность:
Сложность: O (расстояние (первый, последний))
Я вижу, что это связано с тем, что нужно настроить ПРЕДЕЦЕССОР (последний) .next = pos.next
, и forward_list
не позволяет этому случиться в O (1).
Хорошо, но разве объединение двух односвязных списков в O (1) не является одной из сильных сторон этой простой структуры данных? Поэтому мне интересно - нет ли операции с forward_list
, которая соединяет / объединяет / соединяет произвольное количество элементов в O (1)?
Конечно, алгоритм был бы довольно простым. Достаточно просто указать имя для операции (псевдокод): ( Обновлено путем интеграции ответа Керрекса)
temp_this = pos.next;
temp_that = last.next;
pos.next = first.next;
last.next = temp_this;
first.next = temp_that;
Результат немного другой, потому что не (первый, последний)
перемещен, но (первый, последний]
.
this: 1 2 3 4 5 6 7 x: 11 12 13 14 15 16 17
^pos ^first ^last
will become:
this: 1 2 13 14 15 16 3 4 5 6 7 x: 11 12 17
^pos ^last ^first
Я думаю, что это такая же разумная операция, как и предыдущая, которую люди могли бы захотеть сделать, особенно если у нее есть то преимущество, что она является O (1).
(первый, последний]
может быть полезен в качестве перемещенного диапазона?