您的位置:首页 > 编程语言 > C语言/C++

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

2017-03-25 14:36 696 查看


一、升序

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


1.1 重载比较操作符

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

[cpp] view
plain copy

 





struct Student{  

    string name;  

    int grade;  

  

    Student(string name, int grade) : name(name), grade(grade){}  

  

    bool operator < (const Student& rhs) const{  

        return grade < rhs.grade  

        || (grade == rhs.grade && name < rhs.name);  

    }  

  

    friend void operator << (ostream& output, const Student& s){  

        output << s.name << " " << s.grade << endl;  

    }  

};  

[cpp] view
plain copy

 





int main()  

{  

    vector<Student> vec;  

  

    vec.emplace_back("Jack", 20);  

    vec.emplace_back("John", 30);  

    vec.emplace_back("Amy", 20);  

    vec.emplace_back("Bill", 90);  

  

    cout << "Before:" << endl;  

    for(auto& s : vec){  

        cout << s;  

    }  

  

    sort(begin(vec),end(vec));  

  

    cout << endl << "After:" << endl;  

    for(auto& s : vec){  

        cout << s;  

    }  

  

    return 0;  

}  


1.2 比较函数

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

[cpp] view
plain copy

 





bool cmp(const Student& lhs, const Student& rhs){  

    return lhs.grade < rhs.grade  

    || (lhs.grade == rhs.grade && lhs.name < rhs.name);  

}  

    按如下方式调用:

[cpp] view
plain copy

 





sort(begin(vec),end(vec), cmp);  


1.3 函数对象

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

[cpp] view
plain copy

 





struct Compare{  

    bool operator()(const Student& lhs, const Student& rhs){  

        return lhs.grade < rhs.grade  

        || (lhs.grade == rhs.grade && lhs.name < rhs.name);  

    }  

};  

    按如下方式调用:

[cpp] view
plain copy

 





sort(begin(vec),end(vec), Compare());  


1.4 Lambda

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

[cpp] view
plain copy

 





sort(begin(vec), end(vec), [](const Student& lhs, const Student& rhs) {  

                return lhs.grade < rhs.grade   

                    || (lhs.grade == rhs.grade && lhs.name < rhs.name); });  


二、降序

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


2.1 reverse

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


2.2 反向迭代

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

[cpp] view
plain copy

 





sort(vec.rbegin(), vec.rend());  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c语言