是否可以在std::sort()
个对象上调用std::vector
,以便我们可以指定将使用哪个成员来比较对象,但无需实现单独的比较函数每个成员。我们可以假设我们要排序的每个成员都将定义<
运算符。如果没有,当我们希望能够按照许多不同的标准对对象容器进行排序时,最好的方法是什么。
答案 0 :(得分:7)
您可以让比较对象具有一个标志,指示要排序的成员。
class Comparo
{
int m_field;
public:
Comparo(int field) : m_field(field) { }
bool operator()(const MyClass & Left, const MyClass & right)
{
switch (m_field)
{
case 0:
return left.A < right.A;
case 1:
return left.B < right.B;
}
}
};
std::vector<MyClass> vec = FillMyVector();
std::sort(vec.begin(), vec.end(), Comparo(0)); // sorts on field A
std::sort(vec.begin(), vec.end(), Comparo(1)); // sorts on field B
答案 1 :(得分:2)
这是使用任意类的任意多个成员进行词典比较的东西。需要C ++ 14用于可变参数模板和编译时整数序列。如果你有C ++ 11,你可以自己实现编译时整数序列。
#include <tuple>
#include <utility> // for make_index_sequence
template<class T, typename... types>
struct member_comparer {
member_comparer(types T::*... args) : ptrs(args...) { }
bool operator()(const T& t1, const T& t2) const {
return do_compare(t1, t2, std::make_index_sequence<sizeof...(types)>());
}
private:
template<size_t... indices>
bool do_compare(const T& t1, const T& t2, std::index_sequence<indices...> ) const {
return std::tie(t1.*std::get<indices>(ptrs)...) <
std::tie(t2.*std::get<indices>(ptrs)...);
}
std::tuple<types T::* ...> ptrs;
};
template<class T, typename... types>
auto make_member_comparer(types T::*... args) {
return member_comparer<T, types...>(args...);
}
你可以像使用它一样:
struct A {
int x;
double y;
float z;
};
auto compare_x_only = make_member_comparer(&A::x);
auto compare_y_then_x = make_member_comparer(&A::y, &A::x);