2013-02-12 63 views
6

Trong C, loại thường thực hiện như trong ví dụ sau:nhầm lẫn về việc sử dụng std :: ít hơn và std :: lớn hơn với 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"); 
} 

Vì vậy, tôi đã viết một số nguồn như trong ví dụ sau đây, mong đợi kết quả tương tự:

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

Nhưng kỳ vọng của tôi không chính xác.

Tại sao không sắp xếp trong STL hoạt động như sắp xếp trong C?

Trả lời

6

std::sort hoạt động như thế bởi vì nó dựa trên ý tưởng của một strict weak ordering, thường (được xác định) được xác định theo điều khoản của toán tử <.

Đối với câu hỏi của bạn; nó hiện có vẻ là "Tôi đã viết một hàm C hoạt động khác với std::sort. Tại sao nó lại khác?". Câu trả lời là: bởi vì bạn đã viết một chức năng khác!

+0

tôi có ý tưởng từ bạn! cảm ơn bạn trai! – user2063889

8

std::sort sắp xếp theo thứ tự tăng dần theo mặc định. Trong trường hợp bạn đang tìm kiếm thứ tự giảm dần, đây là lừa:

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 

Bằng cách này, bạn dứt khoát nói rằng std::sort nên đối xử với mảng của bạn như kết thúc của nó là sự khởi đầu và ngược nó lại, mà kết quả trong mảng của bạn được sắp xếp theo Thứ tự giảm dần. Here's the full example.


Và trong trường hợp bạn muốn sử dụng std::lessstd::greater, sau đó nó có thể trông như thế này:

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 

Full ví dụ với giải pháp thứ hai là here.

Các vấn đề liên quan