std::stable_sort
| Defined in header <algorithm>
|
||
template< class RandomIt >
void stable_sort( RandomIt first, RandomIt last );
|
(1) | (constexpr since C++26) |
template< class RandomIt, class Compare >
void stable_sort( RandomIt first, RandomIt last, Compare comp );
|
(2) | (constexpr since C++26) |
template< class ExecutionPolicy, class RandomIt >
void stable_sort( ExecutionPolicy&& policy,
RandomIt first, RandomIt last );
|
(3) | (since C++17) |
template< class ExecutionPolicy, class RandomIt, class Compare >
void stable_sort( ExecutionPolicy&& policy,
RandomIt first, RandomIt last, Compare comp );
|
(4) | (since C++17) |
Sorts the elements in the target range [first, last). The order of equivalent elements is guaranteed to be preserved.
comp.policy.true:
|
|
(until C++20) |
|
|
(since C++20) |
If any of the following conditions is satisfied, the behavior is undefined:
|
(until C++11) |
|
(since C++11) |
Parameters
| first, last | - | the pair of iterators defining the target range |
| comp | - | comparison function object (i.e. an object that satisfies the requirements of Compare) which returns true if the first argument is less than (i.e. is ordered before) the second. The signature of the comparison function should be equivalent to the following:
While the signature does not need to have |
| policy | - | the execution policy to use |
| Type requirements | ||
-RandomIt must meet the requirements of LegacyRandomAccessIterator.
| ||
-Compare must meet the requirements of Compare.
| ||
Complexity
Given N as last - first:
operator<(until C++20)std::less{}(since C++20) (or only 𝓞(N·log(N)) comparisons if enough extra memory is available).comp (or only 𝓞(N·log(N)) comparisons if enough extra memory is available).Exceptions
- If the temporary memory resources required for parallelization are not available, std::bad_alloc is thrown.
- If an uncaught exception is thrown while accessing objects via an algorithm argument, the behavior is determined by the execution policy (for standard policies, std::terminate is invoked).
Notes
This function attempts to allocate a temporary buffer equal in size to the sequence to be sorted. If the allocation fails, the less efficient algorithm is chosen.
| Feature-test macro | Value | Std | Feature |
|---|---|---|---|
__cpp_lib_constexpr_algorithms |
202306L |
(C++26) | constexpr stable sorting, overloads (1,2)
|
Possible implementation
See also the implementations in libstdc++ and libc++.
Example
#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';
}
Output:
32, Arthur
108, Zaphod
108, Ford
