错误expression: invalid operator<

今天写了一段数组从大到小倒排序的代码,大意像这样:

bool compare( int a, int b )

{

    return a >= b;

}

std::sort( intArray.begin(), intArray.end(), compare );


希望大小相等的元素保持原来的相对次序,所以用了“>=”号,而不是">"号。

debug方式下运行到std::sort()处弹出如下对话框:


实在看不懂STL的源码,就去百度搜索了 expression: invalid operator<

明白为什么了,说是要求compare()函数严格弱排序,即a==b应该返回false。

参见 

http://blog.sina.com.cn/s/blog_5f99444c0101bz6t.html

https://support.microsoft.com/zh-cn/kb/949171

STL源码片段如下:

bool __CLRCALL_OR_CDECL _Debug_lt_pred(_Pr _Pred, _Ty1& _Left, _Ty2& _Right,

const wchar_t *_Where, unsigned int _Line)

{// test if _Pred(_Left, _Right) and _Pred is strict weak ordering

if (!_Pred(_Left, _Right))

return (false);

else if (_Pred(_Right, _Left))

_DEBUG_ERROR2("invalid operator<", _Where, _Line);//断言出现在这里。

return (true);

}

可见,如果compare(a,b)为真, 还要再检查compare(b,a)为假才能返回true.

也就是说,你必须提供一个像小于号"<"一样的谓词函数,否则就不让你编译通过。看来应当规范地只用“<"或">"来做谓词。可能STL中其他地方都是这样对谓词做了假设的吧,所以用户提供的谓词也必须对相等说不。

Scott Meyer在effective c++系列书中讨论过谓词函数的问题,具体内容记不太清了,看来还是没掌握这个问题啊。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值