关于使用std :: sort的std :: less和std :: more的困惑

在C中,sort通常实现,如下例所示:

#include  void Sort( int* arr, int n, bool(*cmp)(int,int) ) { for( int i=0; i<n-1; i++ ) { for( int j=i+1; j b; } // greater int descending( int a, int b ) { return a < b; } // less void main() { int arr[10] = { 1,3,5,7,9,2,4,6,8,10 }; // ascending Sort( arr, 10, ascending ); for( int i=0; i<10; i++ ) printf( "%d ", arr[i] ); printf( "\n" ); // descending Sort( arr, 10, descending ); for( int i=0; i<10; i++ ) printf( "%d ", arr[i] ); printf( "\n" ); } 

所以我在下面的例子中编写了一些源代码,期望得到相同的结果:

 #include  #include  // for sort #include  // for less & greater using namespace std; bool gt( int a, int b ) { return a > b; } // greater bool ls( int a, int b ) { return a < b; } // less void main() { int x[10] = { 1,3,5,7,9,2,4,6,8,10 }; // ascending but descending sort( x, x+10, gt ); for( int i=0; i<10; i++ ) cout << x[i] << " "; cout << endl; // descending but ascending sort( x, x+10, ls ); for( int i=0; i<10; i++ ) cout << x[i] << " "; cout << endl; greater g; // a > b less l; // a < b // ascending but descending sort( x, x+10, g ); for( int i=0; i<10; i++ ) cout << x[i] << " "; cout << endl; // descending but ascending sort( x, x+10, l ); for( int i=0; i<10; i++ ) cout << x[i] << " "; cout << endl; } 

但我的期望并不正确。

为什么STL中的排序不像C中的排序?

std::sort行为与此类似,因为它基于严格弱排序的概念 ,这通常是根据<运算符定义的。

至于你的问题; 它目前似乎是“我写了一个与std::sort行为不同的C函数。为什么它不同?”。 答案是:因为你写了不同的function!

std::sort默认按升序排序。 如果您正在寻找降序,这里的诀窍是:

 int x[10] = { 1,3,5,7,9,2,4,6,8,10 }; std::vector vec(x, x+10); // construct std::vector object std::sort(vec.rbegin(),vec.rend()); // sort it in reverse manner 

这样,你明确地说std::sort应该把你的数组视为它的结束是它的开始,反之亦然,这会导致你的数组按降序排序。 这是完整的例子。


如果你想使用std::lessstd::greater ,那么它看起来像这样:

 int x[10] = { 1,3,5,7,9,2,4,6,8,10 }; std::sort(x, x + 10, std::less()); // for ascending order std::sort(x, x + 10, std::greater()); // for descending order 

这里有第二个解决方案的完整示例。