2013-02-12 51 views
6

在C,排序通常执行如下面的例子:混淆使用std ::少和std ::有更大的std ::排序

#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"); 
} 

所以我写了一些源,如下面的例子中,期待相同的结果:

#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; 
} 

但我的期望是不正确的。

为什么不按照C排序在STL工作?

回答

6

std::sort表现得如此,因为它基于strict weak ordering的想法,该想法是(通常)根据<运算符定义的。

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

+0

我从你那里得到了一个主意!谢谢,伙计! – user2063889 2013-02-13 02:11:39

8

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 

这样,你就直接说std::sort应该把你的数组作为它的终点是它的开始,反之亦然,这将导致数组中进行排序在降序。 Here's the full example.


而如果你想使用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 

用第二溶液全部例子是here