std::stable_sort
Определено в заголовочном файле <algorithm> | ||
|---|---|---|
template< class RandomIt > void stable_sort( RandomIt first, RandomIt last ); | (1) | (constexpr с C++26) |
template< class ExecutionPolicy, class RandomIt >
void stable_sort( ExecutionPolicy&& policy,
RandomIt first, RandomIt last );
| (2) | (с C++17) |
template< class RandomIt, class Compare > void stable_sort( RandomIt first, RandomIt last, Compare comp ); | (3) | (constexpr с C++26) |
template< class ExecutionPolicy, class RandomIt, class Compare >
void stable_sort( ExecutionPolicy&& policy,
RandomIt first, RandomIt last, Compare comp );
| (4) | (с C++17) |
Сортирует элементы в диапазоне [first, last) в неубывающем порядке. Порядок эквивалентных элементов гарантированно сохраняется.
comp.policy.true: |
| (до C++20) |
|
| (с C++20) |
Если выполняется любое из следующих условий, поведение не определено:
| (до C++11) |
| (с C++11) |
Параметры
| first, last | - | пара итераторов, задающая диапазон сортируемых элементов |
| policy | - | политика выполнения, которая будет использоваться |
| comp | - | объект функционального типа для сравнения (то есть объект, удовлетворяющий требованиям Compare), который возвращает true, если первый аргумент меньше второго (то есть расположен перед ним). Сигнатура функции сравнения должна быть эквивалентна следующей: boolcmp(constType1&a,constType2&b); Хотя сигнатура не обязана содержать const&, функция не должна изменять переданные ей объекты и должна принимать любые значения типов (возможно, const) |
| Требования к типам | ||
-RandomIt должен удовлетворять требованиям LegacyRandomAccessIterator. |
||
-Compare должен удовлетворять требованиям Compare. |
||
Сложность
Пусть \(\scriptsize N\)N — это last - first:
std::less{}(с C++20), если доступно достаточно дополнительной памяти; в противном случае — \(\scriptsize O(N \cdot \log^{2}(N))\)O(N·log2(N)) сравнений. 3,4) \(\scriptsize O(N \cdot \log(N))\)O(N·log(N)) применений функции сравнения comp, если доступно достаточно дополнительной памяти; в противном случае — \(\scriptsize O(N \cdot \log^{2}(N))\)O(N·log2(N)) применений. Исключения
Перегрузки с параметром шаблона с именем ExecutionPolicy сообщают об ошибках следующим образом:
- Если выполнение функции, вызванной в составе алгоритма, приводит к выбросу исключения и
ExecutionPolicyявляется одной из стандартных политик, вызываетсяstd::terminate. Для любого другогоExecutionPolicyповедение определяется реализацией. - Если алгоритму не удаётся выделить память, выбрасывается
std::bad_alloc.
Возможная реализация
См. также реализации в libstdc++ и libc++.
Примечания
Эта функция пытается выделить временный буфер размером, равным размеру сортируемой последовательности. Если выделить память не удаётся, используется менее эффективный алгоритм.
| Макрос проверки поддержки возможностей | Значение | Стандарт | Возможность |
|---|---|---|---|
__cpp_lib_constexpr_algorithms | 202306L | (C++26) | constexpr-сортировка с сохранением порядка, перегрузки (1), (3) |
Пример
#include <algorithm>
#include <array>
#include <iostream>
#include <string>
#include <vector>
struct Employee
{
int age;
std::string name; // Does not participate in comparisons
};
bool operator<(const Employee& lhs, const Employee& rhs)
{
return lhs.age < rhs.age;
}
#if __cpp_lib_constexpr_algorithms >= 202306L
consteval auto get_sorted()
{
auto v = std::array{3, 1, 4, 1, 5, 9};
std::stable_sort(v.begin(), v.end());
return v;
}
static_assert(std::ranges::is_sorted(get_sorted()));
#endif
int main()
{
std::vector<Employee> v{{108, "Zaphod"}, {32, "Arthur"}, {108, "Ford"}};
std::stable_sort(v.begin(), v.end());
for (const Employee& e : v)
std::cout << e.age << ", " << e.name << '\n';
}
Вывод:
32, Arthur 108, Zaphod 108, Ford
См. также
| сортирует диапазон элементов (шаблон функции и функциональный объект алгоритма) |
|
|
(C++20) | |
| сортирует первые N элементов диапазона (шаблон функции и функциональный объект алгоритма) |
|
|
(C++20) | |
| разделяет элементы на две группы, сохраняя их относительный порядок в каждой группе (шаблон функции и функциональный объект алгоритма) |
|
|
(C++20) | |
|
(C++20) | сортирует диапазон элементов, сохраняя относительный порядок эквивалентных элементов (функциональный объект алгоритма) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/algorithm/stable_sort