Ежедневный бит(е) C++ #243. Алгоритм стабильной сортировки: std::stable_sort.

std::stable_sort — это более медленная версия std::sort, которая дополнительно обеспечивает стабильность, т. е. эквивалентные элементы сохраняют свои относительные позиции.

Это важно, особенно для интерактивных случаев, когда один диапазон можно неоднократно сортировать по разным аспектам.

#include <algorithm>
#include <vector>

struct Data {
    int a;
    int b;
    int c;
};

std::vector<Data> data{
    {0, 1, 1},
    {0, 2, 1},
    {1, 1, 2},
    {1, 2, 2},
    {2, 1, 3},
    {2, 2, 3},
};

// Sort by b
std::ranges::stable_sort(data, {}, &Data::b);
// Guaranteed order:
// {{0,1,1},{1,1,2},{2,1,3},{0,2,1},{1,2,2},{2,2,3}}

// Sort by c
std::ranges::stable_sort(data, {}, &Data::c);
// Guaranteed order:
// {{0,1,1},{0,2,1},{1,1,2},{1,2,2},{2,1,3},{2,2,3}}

std::vector<std::string> labels{
   "a", "aa", "aaa", "b", "bb", "bbb", 
   "c", "cc", "ccc", "d", "dd", "ddd"
};

std::ranges::stable_sort(labels, {}, [](const auto& l) {
    return l.length();
});
// Guaranteed order:
// "a", "b", "c", "d", "aa", "bb", "cc", "dd", 
// "aaa", "bbb", "ccc", "ddd"

Откройте пример в Compiler Explorer.