std::sort
поддерживает два способа сравнения элементов: 1. bool operator<(YourClass const & lhs, YourClass const & rhs);
2. компаратор, который передается в std::sort
Как провести лексикографическое сравнение вашего класса.Лучший способ использовать std::tuple
, обеспечивающий такие функциональные возможности:
#include <iostream>
#include <algorithm>
#include <tuple>
#include <vector>
#include <string>
struct MyClass{
std::string a;
std::string b;
int x;
double y;
std::tuple<std::string const &, std::string const &> asTupleForComparison() const
{
return std::tie(a, b);
}
};
int main()
{
std::vector<MyClass> vec = {{std::string("a"), std::string("b"), 0, 0.0},
{std::string("a"), std::string("a"), 0, 0.0}};
std::sort(vec.begin(), vec.end(), [](MyClass const & lhs, MyClass const & rhs){
return lhs.asTupleForComparison() < rhs.asTupleForComparison();
});
for (auto const & item : vec)
{
std::cout << item.a << " " << item.b << "\n";
}
return 0;
}
, для решения проблемы частных переменных используйте friend
:
class MyClass{
std::string a;
std::string b;
int x;
double y;
std::tuple<std::string const &, std::string const &> asTupleForComparison() const
{
return std::tie(a, b);
}
friend bool compare(MyClass const & lhs, MyClass const & lhs)
{
return lhs.asTupleForComparison() < rhs.asTupleForComparison();
}
};