今天写了一段数组从大到小倒排序的代码,大意像这样:
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
const
{//
if
return
else
_DEBUG_ERROR2("invalid
return
}
可见,如果compare(a,b)为真, 还要再检查compare(b,a)为假才能返回true.也就是说,你必须提供一个像小于号"<"一样的谓词函数,否则就不让你编译通过。看来应当规范地只用“<"或">"来做谓词。可能STL中其他地方都是这样对谓词做了假设的吧,所以用户提供的谓词也必须对相等说不。
Scott Meyer在effective c++系列书中讨论过谓词函数的问题,具体内容记不太清了,看来还是没掌握这个问题啊。