std::stable_sort

Header: <algorithm>

Sorts the elements in the range [first,last) in non-descending order. The order of equivalent elements is guaranteed to be preserved.

# Declarations

template< class RandomIt >
void stable_sort( RandomIt first, RandomIt last );

(constexpr since C++26)

template< class ExecutionPolicy, class RandomIt >
void stable_sort( ExecutionPolicy&& policy,
RandomIt first, RandomIt last );

(since C++17)

template< class RandomIt, class Compare >
void stable_sort( RandomIt first, RandomIt last, Compare comp );

(constexpr since C++26)

template< class ExecutionPolicy, class RandomIt, class Compare >
void stable_sort( ExecutionPolicy&& policy,
RandomIt first, RandomIt last, Compare comp );

(since C++17)

# Parameters

# 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.

# 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';
}

# See also