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

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中的排序?

Lih*_*ihO 9

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::lessstd::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)

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


Oli*_*rth 7

std::sort表现得像那样,因为它基于严格的弱排序的概念,这通常是根据<运算符定义的.

至于你的问题; 它目前似乎是"我写了一个行为不同的C函数std::sort.为什么它不同?".答案是:因为你写了不同的功能!