use*_*889 7 c c++ sorting stl less
在C中,sort通常实现,如下例所示:
#include <stdio.h>
void Sort( int* arr, int n, bool(*cmp)(int,int) )
{
for( int i=0; i<n-1; i++ )
{
for( int j=i+1; j<n; j++ )
{
if( cmp(arr[i], arr[j]) )
swap( arr[i], arr[j] );
}
}
}
int ascending( int a, int b ) { return a > 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" );
}
Run Code Online (Sandbox Code Playgroud)
所以我在下面的例子中编写了一些源代码,期望得到相同的结果:
#include <iostream>
#include <algorithm> // for sort
#include <functional> // 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<int> g; // a > b
less<int> 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;
}
Run Code Online (Sandbox Code Playgroud)
但我的期望并不正确.
为什么在STL中排序不像C中的排序?
std::sort默认情况下按升序排序.如果你正在寻找降序,这是诀窍:
int x[10] = { 1,3,5,7,9,2,4,6,8,10 };
std::vector<int> vec(x, x+10); // construct std::vector object
std::sort(vec.rbegin(),vec.rend()); // sort it in reverse manner
Run Code Online (Sandbox Code Playgroud)
这样,您明确地说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<int>()); // for ascending order
std::sort(x, x + 10, std::greater<int>()); // for descending order
Run Code Online (Sandbox Code Playgroud)
这里有第二个解决方案的完整示例.