解释标准库排序函数C ++比较谓词的工作?

时间:2018-07-06 09:06:22

标签: c++ function sorting c++11

阅读了关于stackoverflow的一些answers之后,我仍然不明白什么时候比较函数必须返回false,什么时候返回true。在this答案中写道,它对小于运算符进行建模,但我现在仍然认为,如果比较函数是这样的:

bool compare(const myClass& object1, const myClass& object2)
{
     if(object1.property < object2.property)
         return true;
     else
         return false;
}

将按升序对myclass个对象的向量进行排序。我说的对吗?...我仍然感到困惑。

2 个答案:

答案 0 :(得分:5)

如有疑问,请阅读reference

comp-

  

比较函数对象(即满足Compare要求的对象),如果第一个参数小于第二个参数(即在第一个参数之前排序),则返回``true''。

     

比较功能的签名应等效于以下内容:

     

bool cmp(const Type1 &a, const Type2 &b);

     

签名不需要具有const&,但是函数对象不得修改传递给它的对象。   Type1和Type2类型必须使得可以取消引用RandomIt类型的对象,然后将其隐式转换为它们两者。

答案 1 :(得分:1)

虽然引用标准很好,但是有时理解它有时会很困难...

尝试用简单的话:

如果要对元素进行排序,则需要某种顺序关系,该关系定义两个元素中的哪个首先出现(“较小者”)。某些数据类型带有自然顺序,例如整数:-12 <-10-0-10 <12。std::sort(不带比较参数)使用此自然顺序对元素升序进行排序。

第三个参数使您可以明确地告诉std::sort应该如何定义此顺序,请设想以下内容:

std::vector v({12, 7, 10});
std::sort(v.begin(), v.end(), [](int x, int y){return x > y;});

看起来不自然,不是吗? std::sort将比较结果解释为“较少”,但是我们实现了“较大”!这样,然后将较大的值(被认为是“较小”)排在较小的值(被认为是“较大”)之前,因此我们已经实现了以降序的顺序进行排序... < / p>

因此,传递给std::sort的比较参数用于对自然顺序进行排序,或者为不存在自然顺序的数据类型明确定义顺序。

侧面说明:订单关系不一定必须是总订单。但是,然后可以按任意顺序对等效元素进行排序(不过,您可以使用std::stable_sort来至少在排序之前保留它们的相对顺序):

int a[12, 7, 10, 7];
std::vector<int*> v({&a[0], &a[1], &a[2], &a[3]});
std::sort(v.begin(), v.end(), [](int* x, int* y) { return *x < *y; });
// v[2] == &a[2]
// v[3] == &a[1]
// BUT:
// v[0] == &a[1] && v[1] == &a[3] || v[0] == &a[3] && v[1] == &a[1]