Namespaces
Variants

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

From cppreference.net

void merge ( forward_list & other ) ;
(1) (начиная с C++11)
(constexpr начиная с C++26)
void merge ( forward_list && other ) ;
(2) (начиная с C++11)
(constexpr начиная с C++26)
template < class Compare >
void merge ( forward_list & other, Compare comp ) ;
(3) (начиная с C++11)
(constexpr начиная с C++26)
template < class Compare >
void merge ( forward_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 должны быть такими, чтобы объект типа forward_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 <forward_list>
std::ostream& operator<<(std::ostream& ostr, const std::forward_list<int>& list)
{
    for (const int i : list)
        ostr << ' ' << i;
    return ostr;
}
int main()
{
    std::forward_list<int> list1 = {5, 9, 1, 3, 3};
    std::forward_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 Применяется к Поведение как опубликовано Корректное поведение
LWG 2045 C++11 Гарантия O(1) при перемещении узлов не могла быть обеспечена если
get_allocator ( ) ! = other. get_allocator ( )
поведение является
неопределённым в этом случае
LWG 3088 C++11 эффект когда * this и other ссылаются
на один и тот же объект не был определён
operator < мог работать некорректно для указателей
определён как no-op
определяется реализацией
используется строгий полный порядок

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

переносит элементы из другого forward_list
(публичная функция-член)
объединяет два отсортированных диапазона
(шаблон функции)
объединяет два упорядоченных диапазона на месте
(шаблон функции)
объединяет два отсортированных диапазона
(функциональный объект алгоритма)
объединяет два упорядоченных диапазона на месте
(функциональный объект алгоритма)