C++ sort 排序(降序、升序)使用总结

来源:互联网 发布:大四迷茫 知乎 编辑:程序博客网 时间:2024/06/05 11:55

一、升序

    C++ sort 函数十分方便,可以对内置类型也可对自定义类型进行快速排序,内置类型的使用比较简单,下面主要讨论自定义类型的排序,一般有如下几种使用方法:

1.1 重载比较操作符

    比如,我们现有一批学生,要根据他们的成绩进行升序排序,成绩如果相等则根据名字升序排序,那么我们可以如下操作:

[cpp] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. struct Student{  
  2.     string name;  
  3.     int grade;  
  4.   
  5.     Student(string name, int grade) : name(name), grade(grade){}  
  6.   
  7.     bool operator < (const Student& rhs) const{  
  8.         return grade < rhs.grade  
  9.         || (grade == rhs.grade && name < rhs.name);  
  10.     }  
  11.   
  12.     friend void operator << (ostream& output, const Student& s){  
  13.         output << s.name << " " << s.grade << endl;  
  14.     }  
  15. };  
[cpp] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. int main()  
  2. {  
  3.     vector<Student> vec;  
  4.   
  5.     vec.emplace_back("Jack", 20);  
  6.     vec.emplace_back("John", 30);  
  7.     vec.emplace_back("Amy", 20);  
  8.     vec.emplace_back("Bill", 90);  
  9.   
  10.     cout << "Before:" << endl;  
  11.     for(auto& s : vec){  
  12.         cout << s;  
  13.     }  
  14.   
  15.     sort(begin(vec),end(vec));  
  16.   
  17.     cout << endl << "After:" << endl;  
  18.     for(auto& s : vec){  
  19.         cout << s;  
  20.     }  
  21.   
  22.     return 0;  
  23. }  
  24. 1.2 比较函数

        当然,我们也可以自己写比较函数,实现如下:

    [cpp] view plain copy
     在CODE上查看代码片派生到我的代码片
    1. bool cmp(const Student& lhs, const Student& rhs){  
    2.     return lhs.grade < rhs.grade  
    3.     || (lhs.grade == rhs.grade && lhs.name < rhs.name);  
    4. }  

        按如下方式调用:

    [cpp] view plain copy
     在CODE上查看代码片派生到我的代码片
    1. sort(begin(vec),end(vec), cmp);  

    1.3 函数对象

        另外一种方式,即构造一个函数对象,抑或叫 functor,其实就是实现了重载 operator() 的一个类,代码如下:

    [cpp] view plain copy
     在CODE上查看代码片派生到我的代码片
    1. struct Compare{  
    2.     bool operator()(const Student& lhs, const Student& rhs){  
    3.         return lhs.grade < rhs.grade  
    4.         || (lhs.grade == rhs.grade && lhs.name < rhs.name);  
    5.     }  
    6. };  

        按如下方式调用:

    [cpp] view plain copy
     在CODE上查看代码片派生到我的代码片
    1. sort(begin(vec),end(vec), Compare());  

    1.4 Lambda

        C++11有了 Lambda 之后,就不必再为某些小函数写具名函数了,如下使用即可:

    [cpp] view plain copy
     在CODE上查看代码片派生到我的代码片
    1. sort(begin(vec), end(vec), [](const Student& lhs, const Student& rhs) {  
    2.                 return lhs.grade < rhs.grade   
    3.                     || (lhs.grade == rhs.grade && lhs.name < rhs.name); });  

    二、降序

        降序排序的方法与升序类似,如果采用比较函数、Lambda 或者比较函数的方式,只需要改一改比较条件就OK了,但是,如果对于Student类,我们定义了 operator < 之后,不想为了降序排序再定义一个 operator > 怎么办?两种办法!

    2.1 reverse

        升序排序之后,用 reverse 反转即可。

    2.2 反向迭代

        直接按如下方式调用即可,不用再去重载 operator > 

    [cpp] view plain copy
     在CODE上查看代码片派生到我的代码片
    1. sort(vec.rbegin(), vec.rend());  

0 0
原创粉丝点击