Ежедневный бит(е) 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.