首页 > 代码库 > C++学习之路: 优先级队列使用模板(防止忘记)
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 Score10 {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 Comp21 {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 }
上例是一个很简单的成绩单排序。 只需简单的写一个排序规则类, 重载一下排序类的()函数调用符号就行了。
此代码用于忘记时复习
C++学习之路: 优先级队列使用模板(防止忘记)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。