关于使用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::less
和std::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
这里有第二个解决方案的完整示例。