既然你要求提供一个动态创建一个合适的比较函数代码...
免责声明:下面的代码可能是没有可比性与像std::stable_sort
稳定的排序算法多次排序向量在性能方面。它只是用来说明一个想法。以下代码是使用C++11
功能编写的,这些功能可能尚未提供给您。但是,可以使用例如boost
轻松地将其重写为C++03
。
让我们假设你有你的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
样函子:
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 })));
首先,你可能想了解['标准:: sort']启动(http://en.cppreference.com/w/cpp/algorithm /分类)。如果你的编译器足够新,可以阅读[lambda函数](http://en.cppreference.com/w/cpp/language/lambda)。 –
轻松完成多种方法。你知道函数或lambda是什么吗?你需要一种你想要的每种排序方法,然后用它作为['std :: sort']的比较器(http://en.cppreference.com/w/cpp/algorithm/sort)。有关如何使用默认排序以及自定义排序(您需要)的示例位于提供的“std :: sort”链接中。 – WhozCraig
至于对您的问题更具体的帮助,一个非常简单的解决方案是有七个不同的排序功能,一个用于三个变量的每个组合。 –