Namespaces
Variants

std::list<T,Allocator>:: merge

From cppreference.net

void merge ( list & other ) ;
(1) (constexpr начиная с C++26)
void merge ( list && other ) ;
(2) (начиная с C++11)
(constexpr начиная с C++26)
template < class Compare >
void merge ( list & other, Compare comp ) ;
(3) (constexpr начиная с C++26)
template < class Compare >
void merge ( list && other, Compare comp ) ;
(4) (начиная с C++11)
(constexpr начиная с C++26)

Объединяет два отсортированных списка в один отсортированный список.

  • Если other ссылается на тот же объект, что и * this , ничего не делает.
  • В противном случае переносит все элементы из other в * this . other становится пустым после объединения.

Эта операция стабильна:

  • Для эквивалентных элементов в двух списках элементы из * this всегда предшествуют элементам из other .
  • Порядок эквивалентных элементов * this и other не изменяется.
1,2) Эквивалентно merge ( other, std:: less < T > ( ) ) (до C++14) merge ( other, std:: less <> ( ) ) (начиная с C++14) .
3,4) Элементы сравниваются с использованием comp .
Если выполняется любое из следующих условий, поведение не определено:
  • * this или other не отсортирован относительно компаратора comp .
  • get_allocator ( ) == other. get_allocator ( ) равно false .

Никакие итераторы или ссылки не становятся недействительными. Указатели и ссылки на элементы, перемещённые из * this , а также итераторы, ссылающиеся на эти элементы, будут ссылаться на те же элементы * this , вместо other .

Содержание

Параметры

other - другой контейнер для слияния
comp - объект функции сравнения (т.е. объект, удовлетворяющий требованиям Compare ), который возвращает ​ true если первый аргумент меньше (т.е. упорядочен перед ) второго.

Сигнатура функции сравнения должна быть эквивалентна следующей:

bool cmp ( const Type1 & a, const Type2 & b ) ;

Хотя сигнатура не обязана иметь const & , функция не должна модифицировать передаваемые ей объекты и должна быть способна принимать все значения типа (возможно const) Type1 и Type2 независимо от категории значения (следовательно, Type1& не допускается , как и Type1 , если для Type1 перемещение не эквивалентно копированию (since C++11) ).
Типы Type1 и Type2 должны быть такими, чтобы объект типа list < T, Allocator > :: const_iterator мог быть разыменован и затем неявно преобразован к обоим из них. ​

Требования к типам
-
Compare должен удовлетворять требованиям Compare .

Исключения

Если исключение выбрасывается по любой причине, эти функции не оказывают эффекта ( строгая гарантия безопасности исключений ). За исключением случаев, когда исключение возникает из операции сравнения.

Сложность

Если other ссылается на тот же объект, что и * this , сравнения не выполняются.

В противном случае, при заданных N 1 как std:: distance ( begin ( ) , end ( ) ) и N 2 как std:: distance ( other. begin ( ) , other. end ( ) ) :

1,2) Не более N 1 +N 2 -1 сравнений с использованием operator < .
3,4) Максимум N 1 +N 2 -1 применений функции сравнения comp .

Пример

#include <iostream>
#include <list>
std::ostream& operator<<(std::ostream& ostr, const std::list<int>& list)
{
    for (const int i : list)
        ostr << ' ' << i;
    return ostr;
}
int main()
{
    std::list<int> list1 = {5, 9, 1, 3, 3};
    std::list<int> list2 = {8, 7, 2, 3, 4, 4};
    list1.sort();
    list2.sort();
    std::cout << "list1: " << list1 << '\n';
    std::cout << "list2: " << list2 << '\n';
    list1.merge(list2);
    std::cout << "merged:" << list1 << '\n';
}

Вывод:

list1:  1 3 3 5 9
list2:  2 3 4 4 7 8
merged: 1 2 3 3 3 4 4 5 7 8 9

Отчеты о дефектах

Следующие отчеты об изменениях поведения, влияющие на дефекты, были применены ретроактивно к ранее опубликованным стандартам C++.

DR Applied to Behavior as published Correct behavior
LWG 300 C++98 эффект, когда * this и other ссылаются
на один и тот же объект, не был определён
определён как no-op
LWG 1207 C++98 было неясно, будут ли итераторы и/или ссылки инвалидированы остаются валидными
LWG 1215 C++98 O(1) перемещение узлов не могло быть гарантировано, если
get_allocator ( ) ! = other. get_allocator ( )
поведение является
неопределённым в этом случае
LWG 3088 C++98 operator < мог работать некорректно для указателей используется реализационно-определённый
строгий полный порядок

Смотрите также

переносит элементы из другого list
(public member function)
объединяет два отсортированных диапазона
(function template)
объединяет два упорядоченных диапазона на месте
(function template)
объединяет два отсортированных диапазона
(algorithm function object)
объединяет два упорядоченных диапазона на месте
(algorithm function object)