由于您要求提供动态创建合适的比较函数的代码......
免责声明:在性能方面,以下代码可能无法与使用稳定的排序算法对向量进行多次排序std::stable_sort
相比。它只是用来说明一个想法。以下代码是使用C++11
功能编写的,您可能尚不可用。但是,它可以很容易地C++03
用例如boost
.
假设你有你的类A
和每个成员变量的一些 getter 函数:
class A
{
public:
float getA() const;
int getB() const;
// and so on.
};
我们将定义返回的函数-1
,如果一个实例A
小于另一个实例0
,如果它们相等,1
否则。这些功能可以更容易地组合。
using comparator = std::function<int (const A&, const A&)>;
template <class T>
comparator
make_comparator( T (A::*f)() const )
{
return [f]( const A& lhs, const A& rhs ) -> int {
if( (lhs.*f)() < (rhs.*f)() )
return -1;
else if( (lhs.*f)() == (rhs.*f)() )
return 0;
else
return 1;
};
}
现在,对于每个成员函数,我们定义一个comparator
:
std::vector<comparator> comparators = {
make_comperator( &A::getA ), make_comparator( &A::getB )
};
我们可以轻松组合比较器功能:
comparator
make_comparator(
const std::vector<comparator> &comparators,
std::deque<unsigned int> indices )
{
if( indices.empty() )
{
return []( const A&, const A& ) -> int { return 0; };
}
unsigned int first = indices.front();
indices.pop_front();
return [first, &comparators, indices]( const A& lhs, const A& rhs ) -> int {
int firstCompared = comparators[first]( lhs, rhs );
if( firstCompared != 0 )
{
return firstCompared;
}
else
{
return make_comparator( comparators, indices )( lhs, rhs );
}
};
}
这些函数可以转换为less
-like 仿函数:
std::function<bool (const A&, const A&)>
to_less( std::function<int( const A&, const A& )> f )
{
return [&f]( const A& lhs, const A& rhs ) -> bool {
return f( lhs, rhs ) < 0;
};
}
在第一列之后排序,而不是第二列:
std::sort( instances.begin(), instances.end(),
to_less( make_comparator( comparators, { 0, 1 } ) ) );