• (转载)C++中的sort函数(一)


    公司认证的leetcode题目中经常会用到sort函数,不是很熟悉,今天系统学习总结下。

    总述

    下面是C++的stl中的排序的所有函数,这个系列的博客会逐一介绍,这次的博客先关注最常用的sort函数。

    函数名 用法
    sort (first, last) 对容器或普通数组中 [first, last) 范围内的元素进行排序,默认进行升序排序。
    stable_sort (first, last) 和 sort() 函数功能相似,不同之处在于,对于 [first, last) 范围内值相同的元素,该函数不会改变它们的相对位置。
    partial_sort (first, middle, last) 从 [first,last) 范围内,筛选出 muddle-first 个最小的元素并排序存放在 [first,middle) 区间中。
    partial_sort_copy (first, last, result_first, result_last) 从 [first, last) 范围内筛选出 result_last-result_first 个元素排序并存储到 [result_first, result_last) 指定的范围中。
    is_sorted (first, last) 检测 [first, last) 范围内是否已经排好序,默认检测是否按升序排序。
    is_sorted_until (first, last) 和 is_sorted() 函数功能类似,唯一的区别在于,如果 [first, last) 范围的元素没有排好序,则该函数会返回一个指向首个不遵循排序规则的元素的迭代器。
    void nth_element (first, nth, last) 找到 [first, last) 范围内按照排序规则(默认按照升序排序)应该位于第 nth 个位置处的元素,并将其放置到此位置。同时使该位置左侧的所有元素都比其存放的元素小,该位置右侧的所有元素都比其存放的元素大。

    sort函数

    使用范围

    C++ STL 标准库中的 sort() 函数,本质就是一个模板函数。正如表 1 中描述的,该函数专门用来对容器或普通数组中指定范围内的元素进行排序,排序规则默认以元素值的大小做升序排序,除此之外我们也可以选择标准库提供的其它排序规则(比如std::greater<T>降序排序规则),甚至还可以自定义排序规则。

    需要注意的是,sort() 函数受到底层实现方式的限制,它仅适用于普通数组和部分类型的容器。换句话说,只有普通数组和具备以下条件的容器,才能使用 sort() 函数:

    1. 容器支持的迭代器类型必须为随机访问迭代器。这意味着,sort() 只对 array、vector、deque 这 3 个容器提供支持;
    2. 如果对容器中指定区域的元素做默认升序排序,则元素类型必须支持<小于运算符;同样,如果选用标准库提供的其它排序规则,元素类型也必须支持该规则底层实现所用的比较运算符;
    3. sort() 函数在实现排序时,需要交换容器中元素的存储位置。这种情况下,如果容器中存储的是自定义的类对象,则该类的内部必须提供移动构造函数和移动赋值运算符。

    局限

    sort函数不保证排序的稳定性,即如果被排序的序列中有多个相同值的元素,并不能保证排序之后他们的相对位置保持不变。

    使用方法

    值得一提的是,sort() 函数位于<algorithm>头文件中,因此在使用该函数前,程序中应包含如下语句:

    #include <algorithm>
    

    sort() 函数有 2 种用法,其语法格式分别为:

    //对 [first, last) 区域内的元素做默认的升序排序
    void sort (RandomAccessIterator first, RandomAccessIterator last);
    //按照指定的 comp 排序规则,对 [first, last) 区域内的元素进行排序
    void sort (RandomAccessIterator first, RandomAccessIterator last, Compare comp);
    

    其中,first 和 last 都为随机访问迭代器,它们的组合 [first, last) 用来指定要排序的目标区域;另外在第 2 种格式中,comp 可以是 C++ STL 标准库提供的排序规则(比如 std::greater),也可以是自定义的排序规则。比如,如果需要做降序排序,那么可以使用std::less<T>,也可以自己写一个降序的函数。具体的用法如下所示

    #include <iostream>     // std::cout
    #include <algorithm>    // std::sort
    #include <vector>       // std::vector
    //以普通函数的方式实现自定义排序规则
    bool mycomp(int i, int j) {
        return (i < j);
    }
    //以函数对象的方式实现自定义排序规则
    class mycomp2 {
    public:
        bool operator() (int i, int j) {
            return (i < j);
        }
    };
    
    int main() {
        std::vector<int> myvector{ 32, 71, 12, 45, 26, 80, 53, 33 };
        //调用第一种语法格式,对 32、71、12、45 进行排序
        std::sort(myvector.begin(), myvector.begin() + 4); //(12 32 45 71) 26 80 53 33
        //调用第二种语法格式,利用STL标准库提供的其它比较规则(比如 greater<T>)进行排序
        std::sort(myvector.begin(), myvector.begin() + 4, std::greater<int>()); //(71 45 32 12) 26 80 53 33
       
        //调用第二种语法格式,通过自定义比较规则进行排序
        std::sort(myvector.begin(), myvector.end(), mycomp2());// 80 71 53 45 33 32 26 12
        sort(myvector.begin() + 4, myvector.end(), mycomp); // 80 71 53 45 12 26 32 33
        //输出 myvector 容器中的元素
        for (std::vector<int>::iterator it = myvector.begin(); it != myvector.end(); ++it) {
            std::cout << *it << ' ';
        }
        return 0;
    }
    

    参考资料

  • 相关阅读:
    Qt 优雅的结束程序
    Qt QPainter实现按钮添加半透明图片
    Qt QTableModel联表显示
    C++ unique 里 类型为vector<vector<int>> 的比较函数
    用JavaScript实现的2048.
    Linux 脚本控制和计划任务
    Linux shell脚本分支循环函数笔记
    Linux shell脚本特殊符号笔记
    Linux shell脚本笔记
    Linux 内存磁盘管理命令笔记
  • 原文地址:https://www.cnblogs.com/bugxch/p/14190989.html
Copyright © 2020-2023  润新知