- 概念:“披着队列外衣的堆”,其中堆的底层一颗完全二叉树。如果树中每个节点的值不小于其左右孩子的值,称为大顶堆,反之则称为小顶堆。
- 定义:
priority_queue<typename, container, functional>
- typename是数据的类型
- container是vector,queue等用数组实现的容器,不能是list
- functional是比较的方式,如果是自己定义的类型,则要去额外实现比较函数,以此来表示是大顶堆 or 小顶堆
- 默认大顶堆 && 小顶堆的定义:
//构造一个大顶堆,堆中小于当前节点的元素需要下沉,因此使用less priority_queue<int, vector<int>, less<int>> maxHeap; //构造一个小顶堆,堆中大于当前节点的元素需要下沉,因此使用greater priority_queue<string, vector<string>, greater<string>> minHeap;
// priority_queue.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。 // #include <iostream> #include <queue> using namespace std; //自定义数据类型,Data类 class Data { public: Data(int i, int d) :id(i), data(d) {} ~Data() {} int getId() { return id; } int getData() { return data; } private: int id; int data; }; //重写仿函数,完成less的功能,也可以用class定义类,此时需要将运算符重载函数设为public // 仿函数是通过重载“()”运算符来模拟函数操作的类 //结构体struct中默认是访问类型是public struct cmp { bool operator() (Data& a, Data& b) { return a.getData() < b.getData(); } }; int main() { priority_queue<Data, vector<Data>, cmp> maxHeap;//维护一个大顶堆, for (int i = 0; i < 10; i++) { Data dt(i, rand()%100); maxHeap.push(dt); } while (!maxHeap.empty()) { Data topData = maxHeap.top(); cout << "id:" << topData.getId() << " " << "data:" << topData.getData() << endl;; maxHeap.pop(); } return 0; }
-
out:
id:6 data:78 id:4 data:69 id:1 data:67 id:9 data:64 id:8 data:62 id:7 data:58 id:0 data:41 id:2 data:34 id:5 data:24 id:3 data:0 D:\Dev-Cpp\code\priority_queue\Debug\priority_queue.exe (进程 11464)已退出,代码为 0。 要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。 按任意键关闭此窗口. . .