Std::sort,std:sort为什么这样设计
比如分析程序的运行结果:看看程序在三种情况下的输出是什么,可能会有例外。
////////////////////////////////////////////////////
#杂注一次
#包含矢量
#包含算法
///////////////////////////////////////////////////
///这里有三个自定义谓词函数,将分别被排序算法使用。
//////////////////////////////////////////////////
布尔比较(int a,int b)
{
返回a-b;布尔比较1(int a,int b)
{
返回一个布尔比较2(int a,int b)
{
返回a
}
/////////////////////////////////////////////////////
///主函数
////////////////////////////////////////////////////
int main(int arg,char * argv[])
{
STD:vector int vec;
vec . push _ back(7);
vec . push _ back(5);
vec . push _ back(8);
vec . push _ back(10);
vec . push _ back(48);
vec . push _ back(32);
vec . push _ back(7);
vec . push _ back(5);
vec . push _ back(3);
vec . push _ back(3);
//第一种情况
std:sort(vec.begin(),vec.end(),compare);
//第二种情况
std:sort(vec.begin()、vec.end()、compare 1);
//第三种情况
std:sort(vec.begin()、vec.end()、compare 2);
getchar();
返回0;
}
//////////////////////////////////////////////////
2.结果
在程序中分别使用这三种情况后(为了节省空间,这里将它们写在一起),结果是:
(1)第一种情况(比较函数)和第三种情况(比较函数2)有错误(断言):
(2)第二种情况(compare1函数),程序运行正常,结果正确。
3.分析
第一种和第三种情况的错误原因是:追溯到stl异常的源代码的函数之一是下面的函数:
模板class _Pr,class _Ty1,class _Ty2内联
bool _ _ clr call _ OR _ CDECL _ Debug _ lt _ pred(_ Pr _ Pred,_Ty1 _Left,_Ty2 _Right,
const wchar_t *_Where,无符号int _Line)
{ //测试_Pred(_左,_右)和_ Pred是否是严格弱序
如果(!_ Pred(_左,_右))
返回(假);
else if(_ Pred(_右,_左))
_DEBUG_ERROR2(无效运算符,_Where,_ Line);
返回(真);
}
这个函数要求当你交换两个被调用参数的位置时,你不能得到相同的真实结果。这就是为什么第一个和第三个不行:A当要比较的两个值相等时,第三种情况B当要比较的两个值不相等时,第一种情况。
但是允许调用的两个参数互换时得到相同的假结果,因为此时两个参数之间没有交换位置!(具体见程序:第一个if返回false)