解释标准库排序函数C++的比较谓词的工作原理?
Explain the working of compare predicate of standard library sort function C++?
在阅读了堆栈溢出的一些答案后,我仍然无法理解比较函数何时必须返回 false,何时返回 true。在这个答案中写道,它对小于运算符进行了建模,但我现在仍然认为,如果比较函数是这样的:
bool compare(const myClass& object1, const myClass& object2)
{
if(object1.property < object2.property)
return true;
else
return false;
}
将按升序对myclass
对象的向量进行排序。我说的对吗?...我想我仍然很困惑。
如有疑问,请阅读参考资料。
补偿 -
比较函数对象(即满足 Compare 要求的对象(,如果第一个参数小于(即在第二个参数之前排序(,则返回 true。
比较函数的签名应等效于以下内容:
bool cmp(const Type1 &a, const Type2 &b);
签名不需要有 const &,但函数对象不得修改传递给它的对象。 类型类型1 和类型2 必须使得 RandomIt 类型的对象可以取消引用,然后隐式转换为这两个对象。
虽然参考标准很好,但理解它有时可能非常困难......
用更简单的话来说,尝试:
如果要对元素进行排序,则需要某种顺序关系来定义两个元素中的哪一个应该先出现("是较小的一个"(。某些数据类型带有自然顺序,例如整数,例如:-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
将比较解释为"更少",但我们实现了"更大"!通过这样做,较大的值(被认为是"较小的"(在较小的值(被认为是"更大的"(之前排序,因此我们实现了降序排序......
因此,传递给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]
- QSqlquery prepare()和bindvalue()不工作
- std::condition_variable::wait()如何评估给定的谓词
- 导入库可以跨dll版本工作吗
- 有没有办法将谓词中的元素偏移量传递给 std 算法?
- 以螺旋方式打印矩阵的程序.(工作不好)
- 对象指针在c++中是如何工作的
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- VSOMEIP-2个设备之间的通信(TCP/UDP)不工作
- 为字符串中每 N 个字符插入空格的函数没有按照我认为的方式工作?
- C++为线程工作动态地分割例程
- 为什么我的 std::ref 无法按预期工作?
- 布尔比较运算符是如何在C++中工作的
- SampleConsensusPrerejective(ext.RANSAC)是如何真正工作的
- 不确定要在我的main中放入什么才能使我的代码正常工作
- 为什么std::condition_variable notify_all的工作速度比notify_one快(对于随机请
- <<操作员在下面的行中工作
- 有人能解释一下为什么下界是这样工作的吗C++的
- ExtractIconEx:可以工作,但偶尔会崩溃
- 解释标准库排序函数C++的比较谓词的工作原理?
- 二进制谓词的工作原理