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++.
| DR | Применимо к | Поведение, как опубликовано | Правильное поведение |
|---|---|---|---|
| LWG 250 | C++98 | ссылки и итераторы на перемещенный(ые) элемент(ы) были все недействительны | они ссылаются или указывают на тот же(ые) элемент(ы) в *this |
| N2525 | C++98 | O(1) слияние не могло быть гарантировано, еслиget_allocator() != other.get_allocator() | поведение в этом случае не определено |
См. также
| объединяет два отсортированных списка (общедоступная функция-член) |
|
| удаляет элементы, удовлетворяющие определенным критериям (общедоступная функция-член) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/container/list/splice