Namespaces
Variants

std::forward_list<T,Allocator>:: splice_after

From cppreference.net
void splice_after ( const_iterator pos, forward_list & other ) ;
(1) (начиная с C++11)
(constexpr начиная с C++26)
void splice_after ( const_iterator pos, forward_list && other ) ;
(2) (начиная с C++11)
(constexpr начиная с C++26)
void splice_after ( const_iterator pos, forward_list & other,
const_iterator it ) ;
(3) (начиная с C++11)
(constexpr начиная с C++26)
void splice_after ( const_iterator pos, forward_list && other,
const_iterator it ) ;
(4) (начиная с C++11)
(constexpr начиная с C++26)
void splice_after ( const_iterator pos, forward_list & other,
const_iterator first, const_iterator last ) ;
(5) (начиная с C++11)
(constexpr начиная с C++26)
void splice_after ( const_iterator pos, forward_list && other,
const_iterator first, const_iterator last ) ;
(6) (начиная с C++11)
(constexpr начиная с C++26)

Перемещает элементы из other в * this . Элементы вставляются после pos .

Если выполняется любое из следующих условий, поведение не определено:

  • pos не находится в диапазоне ( before_begin() , end() ) .
  • get_allocator ( ) == other. get_allocator ( ) равно false .
1,2) Перемещает все элементы из other . other становится пустым после операции.
Если * this и other ссылаются на один и тот же объект, поведение не определено.
3,4) Перемещает элемент, следующий за it .
* this и other могут ссылаться на один и тот же объект. В этом случае нет эффекта, если pos == it или pos == ++ it является true .
Если ++ it не находится в диапазоне [ begin ( ) , end ( ) ) , поведение не определено.
5,6) Перемещает элементы в диапазоне ( first , last ) .
* this и other могут ссылаться на один и тот же объект.
Если удовлетворяется любое из следующих условий, поведение не определено:
  • ( first , last ) не является допустимым диапазоном в other ,
  • Любой итератор в ( first , last ) не является разыменуемым.
  • pos находится в ( first , last ) .

Никакие итераторы или ссылки не становятся недействительными. Если * this и other ссылаются на разные объекты, итераторы перемещённых элементов теперь ссылаются на * this , а не на other .

Содержание

Параметры

pos - элемент, после которого будет вставлено содержимое
other - другой контейнер, из которого переносится содержимое
it - итератор, предшествующий итератору элемента для переноса из other в * this
first, last - пара итераторов, определяющая диапазон элементов для переноса из other в * this

Исключения

1-4) Ничего не выбрасывает.

Сложность

1,2) Линейно по размеру other .
3,4) Константа.
5,6) Линейно по std:: distance ( first, last ) .

Пример

#include <cassert>
#include <forward_list>
int main()
{
    using F = std::forward_list<int>;
    // Демонстрация значения открытого диапазона (first, last)
    // в перегрузке (5): первый элемент l1 не переносится.
    F l1 = {1, 2, 3, 4, 5};
    F l2 = {10, 11, 12};
    l2.splice_after(l2.cbegin(), l1, l1.cbegin(), l1.cend());
    // Не эквивалентно l2.splice_after(l2.cbegin(), l1);
    // что эквивалентно
    // l2.splice_after(l2.cbegin(), l1, l1.cbefore_begin(), l1.end());
    assert((l1 == F{1}));
    assert((l2 == F{10, 2, 3, 4, 5, 11, 12}));
    // Перегрузка (1)
    F x = {1, 2, 3, 4, 5};
    F y = {10, 11, 12};
    x.splice_after(x.cbegin(), y);
    assert((x == F{1, 10, 11, 12, 2, 3, 4, 5}));
    assert((y == F{}));
    // Перегрузка (3)
    x = {1, 2, 3, 4, 5};
    y = {10, 11, 12};
    x.splice_after(x.cbegin(), y, y.cbegin());
    assert((x == F{1, 11, 2, 3, 4, 5}));
    assert((y == F{10, 12}));
    // Перегрузка (5)
    x = {1, 2, 3, 4, 5};
    y = {10, 11, 12};
    x.splice_after(x.cbegin(), y, y.cbegin(), y.cend());
    assert((x == F{1, 11, 12, 2, 3, 4, 5}));
    assert((y == F{10}));
}

Отчеты о дефектах

Следующие отчеты об изменениях поведения, влияющие на дефекты, были применены ретроактивно к ранее опубликованным стандартам C++.

DR Применяется к Поведение как опубликовано Корректное поведение
LWG 2045 C++11 Гарантия O(1) слияния не могла быть обеспечена если
get_allocator ( ) ! = other. get_allocator ( )
поведение является
неопределённым в этом случае
LWG 2222 C++11 элемент, на который указывает it не переносится, но указатели, ссылки и
итераторы, ссылающиеся на него, будут ссылаться на элемент в * this после слияния
всё ещё ссылаются на
элемент в other

Смотрите также

объединяет два отсортированных списка
(public member function)
удаляет элементы, удовлетворяющие определенным критериям
(public member function)
возвращает итератор на элемент перед началом
(public member function)