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++.

Отчёт об ошибке Применён к Опубликованное поведение Корректное поведение
LWG 250 C++98 ссылки и итераторы на перемещённые
элементы становились недействительными
они ссылаются на те же
элементы в *this
N2525 C++98 сращивание за O(1) не гарантировалось, если
get_allocator() != other.get_allocator()
в этом случае поведение
не определено

См. также

merge
объединяет два отсортированных списка
(открытая функция-член)
insert_range
(C++23)
вставляет диапазон элементов
(открытая функция-член)

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

Spec-Zone.ru

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