c++ - std::sort 中用 lambda 函数指定的比较函数是否返回 bool 类型?

我正在阅读这段代码(source):

#include <iostream> 
#include <functional>
#include <algorithm>
using namespace std; 

int main() { 
    int number[] = {3, 5, 1, 6, 9};
    auto print = [](int n) { cout << n << " "; };

    sort(begin(number), end(number), [](int n1, int n2) { return n2 - n1; });
    // result: 9 6 1 5 3
    for_each(begin(number), end(number), print);
    cout << endl;

    sort(begin(number), end(number), [](int n1, int n2) { return n1 - n2; });
    // result: 3 5 1 6 9
    for_each(begin(number), end(number), print);
    cout << endl;

    return 0; 
} 

我对 return n2 - n1;return n1 - n2; 的工作方式感到困惑。

根据 std::sort - cppreference.com ,它说 comp 是一个 bool 类型的函数。在 C++ 中,非零数字始终具有真值(根据 Do negative numbers return false in C/C++? - Stack Overflow )。

因此,上面示例中的 number 内部有不同的项,将始终导致其中两个 lambda 函数返回 true。也就是说,在这种情况下,那些 lambda 函数返回相同的结果。但是结果显示,一个是反序的,一个是原序的。

我该如何解释这个或者我错过了什么?

最佳答案

此处使用的比较函数无效。如果 LHS 在预期的排序顺序中位于 RHS 之前,则传递给 sort() 的函数应该返回 true,否则返回 false(即它应该表现得像“小于”)。这里的 lambda 表达式都不是这样的,因此使用这些函数中的任何一个调用 sort() 都是未定义的行为。

在这两个调用中,sort() 最终都颠倒了给定的顺序。这只是一个意外,是 sort() 恰好在您的系统上实现的方式的意外随机副作用。如果您尝试使用不同的编译器,您可能会得到不同的结果(例如崩溃)。

https://stackoverflow.com/questions/67995381/

相关文章:

awk - 使用 awk 和 gsub 用字符串替换 CSV 的列

javascript - console.log 在我的输入字段中给出 undefined

flutter - 错误 : A non-null value must be returned s

flutter - 检查 flutter 中的连接并根据连接状态更改状态

python - Django Channels - Websocket 连接失败

regex - 字符串和数字的 Perl 正则表达式 - 仅匹配最后 6 位数字

flutter - 如何将二进制字符串转换为文本字符串并在 flutter 中反转?

ruby - 如何在 ruby​​ 中编写一个采用散列样式、方括号参数的方法,例如 mymethod

r - 如何对r中的几列求和?

kubernetes - 如何在 Kubernetes cronjob 中执行脚本 shell