我正在阅读这段代码(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 中反转?