std::forward_list<T,Allocator>:: merge
|
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 не изменяется.
- * 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)
|
| Требования к типам | ||
-
Compare
должен удовлетворять требованиям
Compare
.
|
||
Исключения
Если исключение выбрасывается по любой причине, эти функции не оказывают никакого эффекта ( строгая гарантия безопасности исключений ). За исключением случаев, когда исключение возникает из сравнения.
Сложность
Если other ссылается на тот же объект, что и * this , сравнения не выполняются.
В противном случае, пусть N 1 равно std:: distance ( begin ( ) , end ( ) ) и N 2 равно std:: distance ( other. begin ( ) , other. end ( ) ) :
Пример
#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
(публичная функция-член) |
|
|
объединяет два отсортированных диапазона
(шаблон функции) |
|
|
объединяет два упорядоченных диапазона на месте
(шаблон функции) |
|
|
(C++20)
|
объединяет два отсортированных диапазона
(функциональный объект алгоритма) |
|
(C++20)
|
объединяет два упорядоченных диапазона на месте
(функциональный объект алгоритма) |