C++ sort vector > or vector 容器的排序


 

C++的STL中提供了很強大的排序函數sort,可以對任意數組,結構體及類進行排序,下面我們先來看最簡單的數組排序。默認的升序排列,我們也可以在后面加上less或greater來告訴編譯器我們想要的排序順序。

 

vector<int> v = {2, 0, 1, 5, 9, 2, 7};

// Ascending order
sort(v.begin(), v.end());
sort(v.begin(), v.end(), less<int>());

// Descending order
sort(v.rbegin(), v.rend());
sort(v.begin(), v.end(), greater<int>());

 

如果是一個二維數組,也可以是用sort,我們可以選擇根據某一列來進行排序,如果我們不重寫cmp函數,那么默認的是根據第一列來排序,當然我們可以通過重寫來根據其他列來排序:

 

/* Input matrix
m = [
        1 4 2 
        0 8 3
        3 5 1
    ]
*/

// Ascending order by first column
sort(m.begin(), m.end());
/*
m = [
        0 8 3
        1 4 2 
        3 5 1
    ]
*/

// Descending order by first column
sort(m.rbegin(), m.rend());
/*
m = [
        3 5 1
        1 4 2 
        0 8 3
    ]
*/


// Ascending order by second column
sort(m.begin(), m.end(), [](const vector<int> &a, const vector<int> &b) { return a[1] < b[1]; } );

bool cmp(const vector<int> &a, const vector<int> &b) {
    return a[0] > b[0];
}
sort(m.begin(), m.end(), cmp);
/*
m = [
        1 4 2 
        3 5 1
        0 8 3
    ]
*/


// Descending order by second column
sort(m.begin(), m.end(), [](const vector<int> &a, const vector<int> &b) { return a[1] > b[1]; } );

bool cmp(const vector<int> &a, const vector<int> &b) {
    return a[0] < b[0];
}
sort(m.begin(), m.end(), cmp);
/*
m = [
        0 8 3
        3 5 1
        1 4 2 
    ]
*/

 

下面來看如何給class排序,我們將自定義的類class裝入到容器vector中,然后根據class中的一個參數為依據進行排序,這里分兩種情況,一個是vector中裝指針的class,一種的裝正常的class,它們再重寫cmp比較函數上有些區別的,參見代碼如下:

class A {
public:
    int a1, a2;
    A(int m, int n): a1(m), a2(n) {}
};

class B {
public:
    int b1, b2;
    B(int m, int n): b1(m), b2(n) {}
};

bool cmp1(A const *a, A const *b) {
    return a->a1 < b->a1;
}

bool cmp2(B const &a, B const &b) {
    return a.b1 < b.b1;
}

void printArray(vector<A*> array) {
    for (int i = 0; i < array.size(); ++i) {
        cout << array[i]->a1 << " " << array[i]->a2 << endl;
    }
    cout << endl;
}

void printArray2(vector<B> array) {
    for (int i = 0; i < array.size(); ++i) {
        cout << array[i].b1 << " " << array[i].b2 << endl;
    }
    cout << endl;
}

int main() {

    vector<A*> array;
    array.push_back(new A(65, 100));
    array.push_back(new A(70, 150));
    array.push_back(new A(56, 90));
    array.push_back(new A(75, 190));
    array.push_back(new A(60, 95));
    array.push_back(new A(68, 110));
    
    printArray(array);
    sort(array.begin(), array.end(), cmp1);
    printArray(array);
    
    vector<B> array2;
    array2.push_back(B(65, 100));
    array2.push_back(B(70, 150));
    array2.push_back(B(56, 90));
    array2.push_back(B(75, 190));
    array2.push_back(B(60, 95));
    array2.push_back(B(68, 110));
    
    printArray2(array2);
    sort(array2.begin(), array2.end(), cmp2);
    printArray2(array2);
    
    return 0;
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM