vector排序总结

447 阅读1分钟

这是我参加「第三届青训营-后端场」笔记创作活动的第3篇笔记

​头文件:#include

示例如下,默认升序

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int main(){
        vector<int>vec{5,4,6,9,8,1};
        sort(vec.begin(), vec.end());// 默认升序
        for(auto n:vec)
                cout<<n<<" ";
        return 0;
}
// 输出为 1 4 5 6 8 9

降序排列(最简单),只需补充

// 方法一:使用标准库比较函数对象
sort(vec.begin(), vec.end(), std::greater<int>());

其他几种自定义方法参考文档

// 方法二:使用自定义函数对象
struct {
    bool operator()(int a, int b) const
    {   
        return a > b;
    }   
} customLess;
sort(s.begin(), s.end(), customLess);

// 方法三:借助lambda表达
std::sort(s.begin(), s.end(), [](int a, int b) {
    return a > b;   
});

复杂度-->快速排序

O(N\dot log(N))​编辑

vector多维数组比较

默认按照第一个维度排序

如果需要对其他维度排序,就需要自己写比较函数

这里用lambda表达来实现

vector<vector<int>>vec(5, vector<int>(5));//构造5x5数组

sort(vec.begin(), vec.end(), [](const vector<int>&a, const vector<int>&b){
    return a[1]>b[1]; // 降序
});// 其他维度同理

vector结构体比较

自定义函数即可,举个简单的例子

我们希望按照结构体的id排序

struct stu{
    int id;
    int age;
    string name;
};

bool sort_by_id(const stu &s1, const stu &s2){
    return s1.id < s2.id; // 升序
}

保留相同元素相对位置比较

stl库中的sort使用的是快速排序(没记错的话),效率比较高

但是如果两个元素大小相同,可能会在排序的过程中相对顺序发生改变

快速排序是一个不稳定的算法,在经过排序之后,可能会对相同值的元素的相对位置造成改变。

因此,如果想保持相对位置不改变,可以使用stable_sort()

基本用法和sort差不多,具体案例见文档​​​​​