Spec-Zone.ru › C++

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

void merge( forward_list& other );
(1) (с C++11)
void merge( forward_list&& other );
(2) (с C++11)
template< class Compare > 
void merge( forward_list& other, Compare comp );
(3) (с C++11)
template< class Compare > 
void merge( forward_list&& other, Compare comp );
(4) (с C++11)

Функция ничего не делает, если other ссылается на тот же объект, что и *this.

В противном случае, она объединяет other в *this. Оба списка должны быть отсортированы. Элементы не копируются, и контейнер other становится пустым после слияния. Эта операция стабильна: для эквивалентных элементов в двух списках, элементы из *this всегда предшествуют элементам из other, и порядок эквивалентных элементов из *this и other не изменяется.

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

1,2) Элементы сравниваются с помощью operator<.
3,4) Элементы сравниваются с помощью comp.

Если *this или other не отсортированы по отношению к соответствующему компаратору или get_allocator() != other.get_allocator(), поведение является неопределённым.

Параметры

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

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

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

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

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

Возвращаемое значение

(нет)

Исключения

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

Сложность

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

В противном случае, учитывая \(\scriptsize N\)N как std::distance(begin(), end()) и \(\scriptsize R\)R как std::distance(other.begin(), other.end()):

1,2) Не более \(\scriptsize N+R-1\)N+R-1 сравнений с использованием operator<.
3,4) Не более \(\scriptsize N+R-1\)N+R-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()
в этом случае поведение
неопределённо

См. также

splice_after
перемещает элементы из другого forward_list
(публичный член-функция)
merge
объединяет два отсортированных диапазона
(шаблон функции)
inplace_merge
объединяет два упорядоченных диапазона на месте
(шаблон функции)
ranges::merge
(C++20)
объединяет два отсортированных диапазона
(niebloid)
ranges::inplace_merge
(C++20)
объединяет два упорядоченных диапазона на месте
(niebloid)

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

Spec-Zone.ru

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