Spec-Zone.ru › C++

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

void splice_after( const_iterator pos, forward_list& other );
(1) (since C++11)
void splice_after( const_iterator pos, forward_list&& other );
(2) (since C++11)
void splice_after( const_iterator pos, forward_list& other,
                   const_iterator it );
(3) (since C++11)
void splice_after( const_iterator pos, forward_list&& other,
                   const_iterator it );
(4) (since C++11)
void splice_after( const_iterator pos, forward_list& other,
                   const_iterator first, const_iterator last );
(5) (since C++11)
void splice_after( const_iterator pos, forward_list&& other,
                   const_iterator first, const_iterator last );
(6) (since 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 О(1) слияние не могло быть гарантировано, если
get_allocator() != other.get_allocator()
поведение в этом случае
не определено

См. также

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

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

Spec-Zone.ru

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