int age;
std::string name; // Does not participate in comparisons
};
bool operator<(const Employee& lhs, const Employee& rhs)
{
return lhs.age < rhs.age;
}
int main()
{
std::vector<Employee> v =
{
{108, "Zaphod"},
{32, "Arthur"},
{108, "Ford"},
};
std::sort(v.begin(), v.end());
for (const Employee& e : v)
std::cout << e.age << ", " << e.name << '\n';
}
и
#include <algorithm>
#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;
}
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';
}
Вывод одинаков, судя по документации(https://en.cppreference.com/w/cpp/algorithm/stable_sort / https://en.cppreference.com/w/cpp/algorithm/sort), второй код будет работать медленнее, ввиду чего возникает вопрос, как правильно использовать stable_sort?
* разница в кодах выше в одной строке: std::stable_sort(v.begin(), v.end());
И
std::sort(v.begin(), v.end());
Стабильные сортировки нужны, когда делаешь что-то вроде Radix Sort, например сначала сортируешь людей по имени, потом по фамилии
Со стабильной сортировкой получится ожидаемый результат — сначала порядок по фамилии , потом по имени
Обсуждают сегодня