• C++学习之路: 优先级队列使用模板(防止忘记)


    当优先级队列中存放我们自定义规则时, 编译器不知道该如何排序

    如: priority_queue<Person> 这种代码是无法通过编译的, 需要我们手动写一个比较规则

    priority_queue<Person, comp> 即可

    代码如下

     1 #include <iostream>
     2 #include <string>
     3 #include <vector>
     4 #include <queue>
     5 #include <fstream>
     6 #include <stdexcept>
     7 using namespace std;
     8 
     9 struct Score
    10 {
    11     int id_;
    12     string name_;
    13     int score_;
    14 
    15     Score(int id, const string &name, int score)
    16         :id_(id), name_(name), score_(score)
    17     { }
    18 };
    19 
    20 class Comp
    21 {
    22 public:
    23     bool operator() (const Score &s1, const Score &s2)
    24     {
    25         if(s1.score_ != s2.score_)
    26             return s1.score_ < s2.score_;
    27         if(s1.name_ != s2.name_)
    28             return s1.name_ > s2.name_;
    29         return s1.id_ > s2.id_;
    30     } 
    31 };
    32 
    33 typedef priority_queue<Score, vector<Score>, Comp> ScoreList;
    34 
    35 void readFile(const string &filename, ScoreList &scores);
    36 void printScoreList(ScoreList &scores);
    37 
    38 int main(int argc, char const *argv[])
    39 {
    40     ScoreList scores;
    41 
    42     readFile("score.txt", scores);
    43     printScoreList(scores);
    44 }
    45 
    46 void readFile(const string &filename, ScoreList &scores)
    47 {
    48     ifstream in(filename.c_str());
    49     if(!in)
    50         throw runtime_error("文件打开失败");
    51 
    52     string line;
    53     while(getline(in, line))
    54     {
    55         int id;
    56         char name[20] = {0};
    57         int score;
    58         sscanf(line.c_str(), "%d %s %d", &id, name, &score);
    59         scores.push(Score(id, name, score));
    60     }
    61 
    62     in.close();
    63 }
    64 
    65 void printScoreList(ScoreList &scores)
    66 {
    67     while(!scores.empty())
    68     {
    69         Score s = scores.top();
    70         scores.pop();
    71         cout << "id = " << s.id_ << " name = " << s.name_ << " score = " << s.score_ << endl;
    72     }
    73 }

    上例是一个很简单的成绩单排序。 只需简单的写一个排序规则类, 重载一下排序类的()函数调用符号就行了。

    此代码用于忘记时复习

  • 相关阅读:
    Flask(7)- request 对象
    2021暑假训练赛1 基于Codeforce#479(div3)
    AtCoder ARC 115 E
    C++11 noexcept 关键字用法学习
    AtCoder ABC 049 C
    【算法学习笔记】块状数据结构:分块思想
    「Codeforces 1131D」Gourmet Choice
    AtCoder Beginner Contest 172 (C题前缀和 + 二分,D题筛因子,E题容斥定理)
    第 45 届国际大学生程序设计竞赛(ICPC)亚洲区域赛(沈阳)补题记录
    泛型动态数组
  • 原文地址:https://www.cnblogs.com/DLzhang/p/4047232.html
Copyright © 2020-2023  润新知