Std--sort,std-sort为什么这样设计

  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)

Std--sort,std-sort为什么这样设计