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 |
См. также
| объединяет два отсортированных списка (открытая функция-член) |
|
| удаляет элементы, соответствующие заданному критерию (открытая функция-член) |
|
| возвращает итератор на элемент перед началом списка (открытая функция-член) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/container/forward_list/splice_after