既然你要求提供一個動態創建一個合適的比較函數代碼...
免責聲明:下面的代碼可能是沒有可比性與像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
至於對您的問題更具體的幫助,一個非常簡單的解決方案是有七個不同的排序功能,一個用於三個變量的每個組合。 –