2013-02-12 8 views
6

w C, sortowania zwykle implementuje jak w poniższym przykładzie:zamieszanie na temat korzystania z std :: mniejsze i większe z std :: std :: 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"); 
} 

Więc napisałem jakieś źródło, jak w poniższym przykładzie, Oczekuję tego samego wyniku:

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

Ale moje oczekiwania nie były prawidłowe.

Dlaczego sortowanie w STL nie działa jak sortowanie w C?

Odpowiedz

6

std::sort Zachowuje się tak, ponieważ opiera się na idei strict weak ordering, która jest (zwykle) zdefiniowana pod kątem operatora <.

Co do twojego pytania; obecnie wydaje się być "Napisałem funkcję C, która zachowuje się inaczej niż std::sort. Dlaczego jest inaczej?". Odpowiedź brzmi: ponieważ napisałeś inną funkcję!

+0

Mam pomysł od Ciebie! Dzięki ziomek! – user2063889

8

std::sort sortuje w porządku rosnącym domyślnie. W przypadku szukasz kolejności malejącej, oto trick:

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 

ten sposób można jednoznacznie powiedzieć, że std::sort powinien traktować swoją tablicę jako jego koniec jest jego początkiem i vice versa, co skutkuje macierzy są klasyfikowane w Kolejność malejąca. Here's the full example.


A w przypadku, gdy chcesz użyć std::less i std::greater, to mogłoby wyglądać tak:

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 

Pełny przykład z drugiego rozwiązania jest here.