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 }

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

此代码用于忘记时复习

时间: 2024-10-14 23:35:51

C++学习之路: 优先级队列使用模板(防止忘记)的相关文章

优先级队列 C++ 模板实现

/* * File name : priority_queue.cpp * Function : 优先级队列 C++ 模板实现 * Created on : 2016年5月05日 * Author : [email protected] * Copyright : 欢迎大家和我一起交流学习,转载请保持源文件的完整性. 任何单位和个人不经本人允许不得用于商业用途 * * */ #include <cstdio> #include <iostream> using namespace

C++学习笔记50:队列类模板

队列是只能向一端添加元素,从另一端删除元素的线性群体 循环队列 在想象中将数组弯曲成环形,元素出队时,后继元素不移动,每当队尾达到数组最后一个元素时,便再回到数组开头. 队列类模板 //Queue.h #ifndef QUEUE_H #define QUEUE_H #include <cassert> //类模板的定义 template <class T, int SIZE = 50> class Queue { private: int front, rear, count; T

我的QT5学习之路(三)——模板库、工具类和控件(中)

一.前言 前面我们了解了关于Qt字符串的一些简单操作,容器类的分类和各自的主要特点以及用途,这一次我们了解一些常见的工具类和常见的控件. 二.QByteArry和QVariant 2.1 QByteArry 关于QByteArry,我们在上篇中曾经看到过.QByteArry和QString的功能和API基本类似,具有很多相似的函数.不同的地方在于QByteArry能够存储原生的二进制数据和8位编码的文本数据,那么何为原生的二进制数据和8为编码的文本数据呢?稍微了解计算机原理的童鞋可能都知道,计算

C++学习之路: 单例模板

引言: 1.单例模式的目的:确保一个类只有一个实例,并提供对该实例的全局访问. 2. 单例模式也称为单件模式.单子模式,可能是使用最广泛的设计模式.其意图是保证一个类仅有一个实例,并提供一个访问它的全局访问点,该实例被所有程序模块共享. 单例模式 如何实现只有一个实例?? 禁用拷贝构造函数,防止拷贝. 那么还可以通过显式定义来 定义多个实例. 如  NonCopyable a, b; 虽然禁止拷贝,但是可以定义多个对象. 所以我们把构造函数也设为私有,这样就不能通过显式定义多个对象了. 那么如果

左式堆 优先级队列类模板 归并排序

#include <cstdio> #include <iostream> #include <cstring> #include <cmath> #include <string> #include <cstdlib> #include<algorithm> using namespace std; template <class elem> class priorityqueue { private: st

STL学习系列七:优先级队列priority_queue容器

1.简介 最大值优先级队列.最小值优先级队列 优先级队列适配器 STL priority_queue 用来开发一些特殊的应用,请对stl的类库,多做扩展性学习 如果我们给每个元素都分配一个数字来标记其优先级,不妨设较小的数字具有较高的优先级,这样我们就可以在一个集合中访问优先级最高的元素并对其进行查找和删除操作了.这样,我们就引入了优先级队列 这种数据结构. 优先级队列(priority queue) 是0个或多个元素的集合,每个元素都有一个优先权,对优先级队列执行的操作有(1)查找(2)插入一

kafka学习之路(二)——提高

kafka学习之路(二)--提高 消息发送流程 因为Kafka内在就是分布式的,一个Kafka集群通常包括多个代理.为了均衡负载,将话题分成多个分区,每个代理存储一或多个分区.多个生产者和消费者能够同时生产和获取消息.     过程: 1.Producer根据指定的partition方法(round-robin.hash等),将消息发布到指定topic的partition里面 2.kafka集群接收到Producer发过来的消息后,将其持久化到硬盘,并保留消息指定时长(可配置),而不关注消息是否

初学算法-基于最小堆的优先级队列C++实现

笔者近日实现了最小堆类及其派生的优先级队列,特将代码奉上,不足之处还请指出! 在实现优先级队列时,笔者表示萌萌哒没有用过template写派生类,结果写完了出现error: *** was not decleared in this scope..后来各种补上this->才完事,在CSDN(笔者的帖子地址? http://bbs.csdn.net/topics/391806995)上提问后才知道是模板参数依赖,笔者表示涨姿势了.. /**  * The Minimum Heap Class an

类与对象的学习之路

---恢复内容开始--- 学习java也有一段时间了,这周踏上了类与对象的学习之路,回过头来总结一下类与对象的基本知识.之前在大一上就接触了Python语言跟C语言,现在开始学习java语言了.我觉得跟之前学的C语言还是有区别的,至于在java书中提及的C++没学习,听别人说C++跟java有点像,这两种编程语言都是面向对象的,并且编程语言本身之间都有很多相似相同的地方. 一.说说类与对象 说到面向对象,那么不得不提的就是类和对象了.Java代码是以类为单位的.在我看来,类就是一个模板,比如一个