在 C++ STL 的比较函数中使用"<="符号而不是"<"符号有什么区别?
What is the difference between using a "<=" sign instead of a "<" sign in the compare function of an STL in C++?
我必须在sort()函数中实现第三个参数cmp,以降序对整数数组进行排序。
问题是这个定义不能正常工作,
bool cmp (int a, int b)
{
if(a<b)
return false;
else
return true;
}
但是,这确实
bool cmp (int a, int b)
{
if(a<=b)
return false;
else
return true;
}
在main()函数中,我使用
sort(Arr,Arr+n,cmp);
请注意,我声称第一个代码无法正常工作,因为我在 Codechef 上解决问题的解决方案在我使用第二个代码时被接受,但不适用于第一个代码。
如果两个值相等,则 STL 比较函数必须返回 false。
在排序中,
最后一个参数:
comp - 比较函数对象(即满足比较要求的对象) ....
比较
比较(a, b)
建立具有以下属性的严格弱排序关系:
对于所有 a,comp(a,a)==false
....
这就是为什么
if(a<=b)
return false;
工作,而
if(a<b)
return false;
不。
std::sort
的比较函数返回一个值,该值指示作为第一个参数传递的元素是否被视为在其定义的特定严格弱排序中先于第二个参数。
这是来自 sgi 的严格弱排序的定义
严格弱排序是比较两个的二进制谓词对象,如果第一个在第二个之前返回 true。这谓词必须满足严格的弱排序。确切的要求如下所述,但是什么他们大致的意思是严格弱排序必须按照方式行事"小于"的行为是:
如果 A 小于 B,
- 则 B 不小于 A,
如果 A 小于 B- 且 B 小于 C,则 A 小于 C,等等。
根据比较函数的文档:
建立严格的弱排序关系
因此,函数comp
必须定义严格的弱排序。根据定义,它必须满足三个条件:
1) 对于所有x
comp(x, x)
为假(自反性条件)
2) 如果comp(x, y)
则!comp(x, y)
(不对称条件)
3) 如果comp(x, y)
且comp(y, z)
则comp(x, z)
(传递条件)
很容易看出,cmp
函数的第一个示例不满足自反性条件,因此不能用作std::sort
的参数传递comp
。同样清楚的是,在x, y
are 数字的情况下,第二个cmp
示例满足所有三个条件,因此它可以作为comp
参数传递给 std::sort。
提供给 std::sort
的比较函数必须返回 true,如果它的第一个参数位于所需的排序中的第二个参数之前,否则返回 false。
因此,对于降序排序,您应该使用 >
运算符>,对于 int
s,它返回<=
运算符返回的补码(您用于实现比较)。最好使用std::greater<int>
来避免此类陷阱。
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 有符号的int和int-有没有一种方法可以在C++中区分它们
- 请解释这句话(cout<<1+int((a<b)^((b-a)&1) )<<endl
- 将无符号char*转换为std::istream*C++
- 呼叫运营商<<临时
- 如何在C++中将一个无符号的 int 转换为两个无符号的短裤?
- vscode g++链路故障:体系结构x86_64的未定义符号
- 从矢量<无符号字符>转换为字符* 包括垃圾数据
- 如何理解将半精度指针转换为无符号长指针和相关的内存对齐
- Visual studio代码重构似乎不起作用(例如,重命名符号-f2)
- 使用gcc从静态链接的文件中查找可选符号
- C++中无符号字符溢出
- 使用无符号字符数组有效存储内存
- 如何防止clang格式在流运算符调用之间添加换行符<<
- C++:Application.cpp中抛出了未解析的外部符号(解决方案在问题的末尾,供未来的读者参考)
- VC++本机单元测试,找不到调试符号
- 为什么我必须在C++中添加一个赋值符号来声明一个数组
- <<操作员在下面的行中工作
- 检查TCHAR数组输入是否为带符号整数C++
- 这是做什么的?如果(无符号(dx) & lt;无符号(大小))