zoukankan      html  css  js  c++  java
  • C++关于sort和priority_queue的运算符重载

    C++中的sort函数默认是将元素升序排列的,而priority_queue默认是将元素降序排列的(默认实现的是大顶堆)。

    自定义运算符用的比较多,以下2种对sort和priority_queue运算符的重载都有效,效果都是一样的:

     1 #include <iostream>
     2 #include <vector>
     3 #include <algorithm>
     4 #include <queue>
     5 using namespace std;
     6 
     7 //sort实现的都是先按a值降序排列,a相同时,按b值降序排列
     8 //priority_queue和sort的默认排序相反,实现的都是先按a值升序排列,a相同时,按b值升序排列
     9 
    10 //重载方式一:
    11 struct Node {
    12     int a, b;
    13     Node(int x, int y) {
    14         a = x;
    15         b = y;
    16     }
    17     bool operator < (const Node &c) const {
    18         if(a == c.a) return b > c.b;
    19         return a > c.a;
    20     }
    21 };
    22 
    23 //重载方式二:注意要有public
    24 // class Node {
    25 //     public:
    26 //     int a, b;
    27 //     Node(int x, int y) {
    28 //         a = x;
    29 //         b = y;
    30 //     }
    31 //     bool operator < (const Node &c) const {
    32 //         if(a == c.a) return b > c.b;
    33 //         return a > c.a;
    34 //     }
    35 // };
    36 int main() {
    37     vector<Node> v;
    38     v.push_back(Node(1,2));
    39     v.push_back(Node(1,4));
    40     v.push_back(Node(4,2));
    41     v.push_back(Node(3,3));
    42     sort(v.begin(), v.end());
    43     for(int i = 0; i < v.size(); ++i) {
    44         cout<<v[i].a<<" "<<v[i].b<<endl;
    45     }
    46     cout<<endl;
    47     
    48     priority_queue<Node> pq;
    49     pq.push(Node(1,2));
    50     pq.push(Node(1,4));
    51     pq.push(Node(4,2));
    52     pq.push(Node(3,3));
    53     while(!pq.empty()) {
    54         cout<<pq.top().a<<" "<<pq.top().b<<endl;
    55         pq.pop();
    56     }
    57     return 0;
    58 }

    输出

    4 2
    3 3
    1 4
    1 2
    
    1 2
    1 4
    3 3
    4 2

    对sort单独自定义运算符:

     1 #include <iostream>
     2 #include <vector>
     3 #include <algorithm>
     4 #include <queue>
     5 using namespace std;
     6 
     7 //sort实现的都是先按a值降序排列,a相同时,按b值降序排列
     8 //priority_queue和sort的默认排序相反,实现的都是先按a值升序排列,a相同时,按b值升序排列
     9 
    10 struct Node {
    11     int a, b;
    12     Node(int x, int y) {
    13         a = x;
    14         b = y;
    15     }
    16 };
    17 /*
    18 //重载方式一:
    19 struct compare {
    20     bool operator()(const Node a, const Node b) {
    21         if(a.a == b.a) return a.b > b.b;
    22         return a.a > b.a;
    23     }
    24 } cmp;
    25 */
    26 
    27 /*
    28 //重载方式二:
    29 bool cmp(const Node a, const Node b) {
    30     if(a.a == b.a) return a.b > b.b;
    31     return a.a > b.a;
    32 }
    33 */
    34 
    35 int main() {
    36     
    37     vector<Node> v;
    38     v.push_back(Node(1,2));
    39     v.push_back(Node(1,4));
    40     v.push_back(Node(4,2));
    41     v.push_back(Node(3,3));
    42     //重载方式一和二:
    43     sort(v.begin(), v.end(), cmp);
    44     //重载方式三:
    45     sort(v.begin(), v.end(), [](const Node a, const Node b) {
    46         if(a.a == b.a) return a.b > b.b;
    47         return a.a > b.a;
    48     });
    49     for(int i = 0; i < v.size(); ++i) {
    50         cout<<v[i].a<<" "<<v[i].b<<endl;
    51     }
    52     cout<<endl;
    53     return 0;
    54 }

    输出都是

    4 2
    3 3
    1 4
    1 2

    对priority_queue单独自定义运算符:

    #include <iostream>
    #include <vector>
    #include <algorithm>
    #include <queue>
    using namespace std;
    
    //sort实现的都是先按a值降序排列,a相同时,按b值降序排列
    //priority_queue和sort的默认排序相反,实现的都是先按a值升序排列,a相同时,按b值升序排列
    
    struct Node {
        int a, b;
        Node(int x, int y) {
            a = x;
            b = y;
        }
    };
    
    struct cmp {
        bool operator()(const Node a, const Node b) {
            if(a.a == b.a) return a.b > b.b;
            return a.a > b.a;
        }
    };
    
    int main() {
        priority_queue<Node, vector<Node>, cmp> pq;
        
        pq.push(Node(1,2));
        pq.push(Node(1,4));
        pq.push(Node(4,2));
        pq.push(Node(3,3));
        while(!pq.empty()) {
            cout<<pq.top().a<<" "<<pq.top().b<<endl;
            pq.pop();
        }
        
        return 0;
    }

    效果:

    1 2
    1 4
    3 3
    4 2
  • 相关阅读:
    shell-用户权限操作
    Python 库列表
    【random】模块运用,随机数实例
    Python 原生文件读写
    Python 运用pymysql+pandas 完成连接 MySQL 数据库读
    MySQL命名、设计及使用规范
    测试for循环计算耗时
    正则表达式速查表
    MySQL8.0.21下载安装详细教程
    MySQL 修改目录重置
  • 原文地址:https://www.cnblogs.com/Deribs4/p/8661931.html
Copyright © 2011-2022 走看看