Spec-Zone.ru › C++

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()
поведение в этом случае
не определено

См. также

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

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

Spec-Zone.ru

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