std::list<T,Allocator>::splice
void splice( const_iterator pos, list& other ); | (1) | |
void splice( const_iterator pos, list&& other ); | (2) | (начиная с C++11) |
void splice( const_iterator pos, list& other, const_iterator it ); | (3) | |
void splice( const_iterator pos, list&& other, const_iterator it ); | (4) | (начиная с C++11) |
void splice( const_iterator pos, list& other,
const_iterator first, const_iterator last);
| (5) | |
void splice( const_iterator pos, list&& other,
const_iterator first, const_iterator last );
| (6) | (начиная с C++11) |
Перемещает элементы из одного списка в другой.
Элементы не копируются и не перемещаются, перенаправляются только внутренние указатели узлов списка. Итераторы и ссылки не становятся недействительными; итераторы на перемещённые элементы остаются действительными, но теперь относятся к *this, а не к other.
1,2) Перемещает все элементы из
other в *this. Элементы вставляются перед элементом, на который указывает pos. После операции контейнер other становится пустым.
3,4) Перемещает элемент, на который указывает
it, из other в *this. Элемент вставляется перед элементом, на который указывает pos.
5,6) Перемещает элементы в диапазоне
[first, last) из other в *this. Элементы вставляются перед элементом, на который указывает pos.Поведение не определено, если
-
get_allocator() != other.get_allocator(), - для перегрузок (1,2)
*thisиotherссылаются на один и тот же объект, - для перегрузок (3,4)
itне является разыменовываемым итератором вotherили - для перегрузок (5,6)
-
[first,last)не является допустимым диапазоном вotherили -
posнаходится в[first,last).
Параметры
| pos | - | элемент, перед которым будет вставлено содержимое |
| other | - | другой контейнер, из которого будет перемещено содержимое |
| it | - | элемент, который нужно переместить из other в *this |
| first, last | - | пара итераторов, задающая диапазон элементов для перемещения из other в *this |
Исключения
Ничего не выбрасывает.
Сложность
1-4) Константная.
5,6) Константная, если
other ссылается на тот же объект, что и *this; в противном случае линейная относительно std::distance(first, last).Пример
#include <iostream>
#include <list>
std::ostream& operator<<(std::ostream& ostr, const std::list<int>& list)
{
for (auto& i : list)
ostr << ' ' << i;
return ostr;
}
int main ()
{
std::list<int> list1{1, 2, 3, 4, 5};
std::list<int> list2{10, 20, 30, 40, 50};
auto it = list1.begin();
std::advance(it, 2);
list1.splice(it, list2);
std::cout << "list1:" << list1 << '\n';
std::cout << "list2:" << list2 << '\n';
list2.splice(list2.begin(), list1, it, list1.end());
std::cout << "list1:" << list1 << '\n';
std::cout << "list2:" << list2 << '\n';
}
Вывод:
list1: 1 2 10 20 30 40 50 3 4 5 list2: list1: 1 2 10 20 30 40 50 list2: 3 4 5
Отчёты об ошибках
Следующие отчёты об ошибках, изменяющие поведение, были применены задним числом к ранее опубликованным стандартам C++.
| Отчёт об ошибке | Применён к | Опубликованное поведение | Корректное поведение |
|---|---|---|---|
| LWG 250 | C++98 | ссылки и итераторы на перемещённые элементы становились недействительными | они ссылаются на те же элементы в *this |
| N2525 | C++98 | сращивание за O(1) не гарантировалось, еслиget_allocator() != other.get_allocator() | в этом случае поведение не определено |
См. также
| объединяет два отсортированных списка (открытая функция-член) |
|
|
(C++23) | вставляет диапазон элементов (открытая функция-член) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/container/list/splice