基于对象的两个属性的Custom Comparator会抛出异常

时间:2017-07-23 20:47:39

标签: c++ vector comparator

我有一个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);

我猜这里自定义比较器返回导致问题的排序对象的矛盾结果?任何帮助表示赞赏。

1 个答案:

答案 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);
}

输入

  • id = 1,rating = 3
  • id = 2,rating = 5
  • id = 9,rating = 4
  • id = 4,rating = 3
  • id = 5,rating = 4

创建输出

  • id = 2,rating = 5
  • id = 9,rating = 4
  • id = 5,rating = 4
  • id = 1,rating = 3
  • id = 4,rating = 3

我更喜欢Lambda表达式而不是全局比较器,因为这样所有代码都会以一个可读的函数结束。

void sortBusinessObjects(vector<Business>& v)
{
    stable_sort(v.begin(), v.end(), [](auto b1, auto b2) {
        return b1.rating > b2.rating;
    });
}