Spec-Zone.ru › C++

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

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

Перемещает элементы из другого forward_list в *this. Элементы вставляются после элемента, на который указывает pos.

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

1,2) Перемещает все элементы из other в *this. После выполнения операции контейнер other становится пустым.
3,4) Перемещает элемент, на который указывает итератор, следующий за it, из other в *this. Не оказывает эффекта, если pos == it или если pos == ++it.
5,6) Перемещает элементы в диапазоне (first, last) из other в *this. Элемент, на который указывает first, не перемещается.

Поведение не определено, если

  • get_allocator() != other.get_allocator(),
  • pos не является ни before_begin(), ни разыменовываемым итератором в [begin(), end()),
  • для перегрузок (1,2) *this и other ссылаются на один и тот же объект,
  • для перегрузок (3,4) итератор, следующий за it, не является разыменовываемым итератором в other, или
  • для перегрузок (5,6),
    • (first, last) не является допустимым диапазоном в other,
    • некоторые итераторы в (first, last) не являются разыменовываемыми, или
    • pos находится в (first, last).

Параметры

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

Исключения

Не генерирует исключений.

Сложность

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

Пример

#include <cassert>
#include <forward_list>

int main()
{
    using F = std::forward_list<int>;
    
    // Demonstrate the meaning of open range (first, last)
    // in overload (5): the first element of l1 is not moved.
    F l1 = {1, 2, 3, 4, 5};
    F l2 = {10, 11, 12};
    
    l2.splice_after(l2.cbegin(), l1, l1.cbegin(), l1.cend());
    // Not equivalent to l2.splice_after(l2.cbegin(), l1);
    // which is equivalent to
    // 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}));
    
    // Overload (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{}));
    
    // Overload (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}));
    
    // Overload (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 Выполнение splice за O(1) нельзя было гарантировать, если
get_allocator() != other.get_allocator()
в этом случае поведение
не определено
LWG 2222 C++11 элемент, на который указывает it, не перемещается, но указатели, ссылки и
итераторы, ссылающиеся на него, после splice указывали бы на элемент в *this
по-прежнему указывают на
элемент в other

См. также

merge
объединяет два отсортированных списка
(открытая функция-член)
removeremove_if
удаляет элементы, соответствующие заданному критерию
(открытая функция-член)
before_begincbefore_begin
возвращает итератор на элемент перед началом списка
(открытая функция-член)

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/container/forward_list/splice_after

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API