std::inplace_merge
| Определён в заголовке <algorithm>
|
||
template< class BidirIt >
void inplace_merge( BidirIt first, BidirIt middle, BidirIt last );
|
(1) | (constexpr начиная с C++26) |
template< class ExecutionPolicy, class BidirIt >
void inplace_merge( ExecutionPolicy&& policy,
BidirIt first, BidirIt middle, BidirIt last );
|
(2) | (начиная с C++17) |
template< class BidirIt, class Compare >
void inplace_merge( BidirIt first, BidirIt middle, BidirIt last,
Compare comp );
|
(3) | (constexpr начиная с C++26) |
template< class ExecutionPolicy, class BidirIt, class Compare >
void inplace_merge( ExecutionPolicy&& policy,
BidirIt first, BidirIt middle, BidirIt last,
Compare comp );
|
(4) | (начиная с C++17) |
Объединяет два последовательных отсортированных диапазона [first, middle) и [middle, last) в один отсортированный диапазон [first, last).
[first, middle) или [middle, last) не является отсортированным относительно operator<(до C++20)std::less{}(начиная с C++20), поведение не определено.[first, middle) или [middle, last) не отсортирован относительно comp, поведение не определено.policy.true:
|
|
(до C++20) |
|
|
(начиная с C++20) |
Эта функция слияния является устойчивой, что означает, что для эквивалентных элементов в исходных двух диапазонах элементы из первого диапазона (с сохранением их исходного порядка) предшествуют элементам из второго диапазона (с сохранением их исходного порядка).
Если выполняется любое из следующих условий, поведение не определено:
[first,middle)или[middle,last)не является допустимым диапазоном.
|
(до C++11) |
|
(начиная с C++11) |
Параметры
| first | - | начало первого отсортированного диапазона |
| middle | - | конец первого отсортированного диапазона и начало второго |
| last | - | конец второго отсортированного диапазона |
| policy | - | политика выполнения для использования |
| comp | - | объект функции сравнения (т.е. объект, удовлетворяющий требованиям Compare), который возвращает true если первый аргумент меньше чем (т.е. упорядочен перед) второго. Сигнатура функции сравнения должна быть эквивалентна следующей:
Хотя сигнатура не обязана содержать |
| Требования к типам | ||
-BidirIt должен удовлетворять требованиям LegacyBidirectionalIterator.
| ||
-Compare должен удовлетворять требованиям Compare.
| ||
Сложность
Пусть N равно std::distance(first, last):
operator<(до C++20)std::less{}(начиная с C++20) если доступно достаточно дополнительной памяти, иначе O(N⋅log(N)) сравнений.operator<(до C++20)std::less{}(начиная с C++20).comp если доступно достаточно дополнительной памяти, иначе O(N⋅log(N)) применений.comp.Исключения
Перегрузки с параметром шаблона с именем ExecutionPolicy сообщают об ошибках следующим образом:
- Если выполнение функции, вызванной в рамках алгоритма, генерирует исключение и
ExecutionPolicyявляется одной из стандартных политик, вызывается std::terminate. Для любой другойExecutionPolicyповедение определяется реализацией. - Если алгоритму не удаётся выделить память, генерируется std::bad_alloc.
Возможная реализация
Смотрите реализации в libstdc++ и libc++.
Примечания
Эта функция пытается выделить временный буфер. Если выделение не удаётся, выбирается менее эффективный алгоритм.
| Макрос проверки возможностей | Значение | Std | Возможность |
|---|---|---|---|
__cpp_lib_constexpr_algorithms |
202306L |
(C++26) | constexpr inplace merging (1), (3)
|
Пример
Следующий код является реализацией сортировки слиянием.
#include <algorithm>
#include <iostream>
#include <vector>
template<class Iter>
void merge_sort(Iter first, Iter last)
{
if (last - first > 1)
{
Iter middle = first + (last - first) / 2;
merge_sort(first, middle);
merge_sort(middle, last);
std::inplace_merge(first, middle, last);
}
}
int main()
{
std::vector<int> v{8, 2, -2, 0, 11, 11, 1, 7, 3};
merge_sort(v.begin(), v.end());
for (const auto& n : v)
std::cout << n << ' ';
std::cout << '\n';
}
Вывод:
-2 0 1 2 3 7 8 11 11
Смотрите также
| объединяет два отсортированных диапазона (шаблон функции & объект функции алгоритма) | |
(C++20) |
|
| сортирует диапазон элементов (шаблон функции & объект функции алгоритма) | |
(C++20) |
|
| сортирует диапазон элементов с сохранением относительного порядка эквивалентных элементов (шаблон функции & объект функции алгоритма) | |
(C++20) |
|
(C++20) |
объединяет два упорядоченных диапазона на месте (объект функции алгоритма) |