我有一个Business对象列表,它有属性id和等级,我想对它们进行排序,以便首先显示评级较高的对象,但如果评级相同,则应保留原始订单。
以下代码是实施:
class Business {
public:
int id;
int rating;
Business(int idP, int ratingP) :id(idP), rating(ratingP) {}
};
bool compare(Business b1, Business b2) {
if (b1.rating != b2.rating) return b1.rating > b2.rating;
return true;
}
void sortBusinessObjects(vector<Business>& v) {
sort(v.begin(), v.end(), compare);
}
然而,当我测试它时,它引发异常(我使用Visual Studio Express并且看不到异常细节)
vector<Business> v{ {1, 3},{2, 5}, {9, 4}, {4, 3}, {5, 4} };
sortBusinessObjects(v);
我猜这里自定义比较器返回导致问题的排序对象的矛盾结果?任何帮助表示赞赏。
答案 0 :(得分:4)
你必须写一个有效的比较器。看看http://fusharblog.com/3-ways-to-define-comparison-functions-in-cpp/
设f(x,y)为比较函数。 f是严格弱的顺序,如果 它满足三个不变量:
Irreflexivity f(x, x) = false. Antisymmetry If x!=y and f(x, y) then !f(y, x) Transitivity If f(x, y) and f(y, z) then f(x, z). Transitivity of Equivalence Let equal(x, y) = !f(x, y) && !f(y, x). If equal(x, y) and equal(y, z) then equal(x, z).
bool compare(Business b1, Business b2)
{
return b1.rating > b2.rating;
}
你必须使用std::stable_sort
来保留相等元素的顺序(!f(x,y) && !f(y,x)
的元素,其中f是比较函数)
void sortBusinessObjects(vector<Business>& v)
{
stable_sort(v.begin(), v.end(), compare);
}
输入
创建输出
我更喜欢Lambda表达式而不是全局比较器,因为这样所有代码都会以一个可读的函数结束。
void sortBusinessObjects(vector<Business>& v)
{
stable_sort(v.begin(), v.end(), [](auto b1, auto b2) {
return b1.rating > b2.rating;
});
}