C++ sort vector<vector<int> > or vector<MyClass> 容器的排序

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介:

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

本文转自博客园Grandyang的博客,原文链接:容器的排序C++ sort vector > or vector,如需转载请自行联系原博主。

相关文章
|
21天前
|
存储 C++ 容器
【C++】vector的底层剖析以及模拟实现
【C++】vector的底层剖析以及模拟实现
|
25天前
|
存储 算法 测试技术
C++:Vector的使用
C++:Vector的使用
|
27天前
|
存储 算法 C++
【C/C++ Vector容量调整】理解C++ Vector:Reserve与Resize的区别与应用
【C/C++ Vector容量调整】理解C++ Vector:Reserve与Resize的区别与应用
23 1
|
24天前
|
设计模式 程序员 C++
【C++ 泛型编程 高级篇】C++模板元编程:使用模板特化 灵活提取嵌套类型与多容器兼容性
【C++ 泛型编程 高级篇】C++模板元编程:使用模板特化 灵活提取嵌套类型与多容器兼容性
241 2
|
11天前
|
存储 编译器 C++
【C++初阶】10. vector的使用及模拟实现
【C++初阶】10. vector的使用及模拟实现
49 1
|
算法 程序员 C语言
【C++ 迭代器】深入探讨 C++ 迭代器:标准与自定义容器中的 begin() 和 cbegin()
【C++ 迭代器】深入探讨 C++ 迭代器:标准与自定义容器中的 begin() 和 cbegin()
46 0
|
24天前
|
存储 安全 编译器
【C++ 17 泛型容器对比】C++ 深度解析:std::any 与 std::variant 的细微差别
【C++ 17 泛型容器对比】C++ 深度解析:std::any 与 std::variant 的细微差别
46 1
|
24天前
|
存储 安全 算法
【C++ 17 包裹类 泛型容器 std::any】深入理解与应用C++ std::any:从泛型编程到多态设计
【C++ 17 包裹类 泛型容器 std::any】深入理解与应用C++ std::any:从泛型编程到多态设计
47 1
|
25天前
|
存储 编译器 C语言
C++:Vector的模拟实现
C++:Vector的模拟实现
|
28天前
|
存储 算法 JavaScript
【C++ 泛型编程 入门篇】 C++ 中的泛型算法 STL(sort,find)(二)
【C++ 泛型编程 入门篇】 C++ 中的泛型算法 STL(sort,find)
27 0