size() empty()是所有容器都有
要求:push_back() pop_back() front()操作,还有随机访问的能力可以使用的顺序容器有:vector deque list
底层实现是基于1.vector 2.堆 实现。
作用:允许为队列中的元素建立优先级,新加入的元素会排在所有优先级比它低的元素之前。
默认使用大顶堆:优先级最大的在堆顶!!!
可以放重复元素!!!
#include <iostream>
#include <queue>
using namespace std;
int main()
{
//队首元素是优先级最高的元素
priority_queue<int> q;
q.push(3); //O(logn),n为当前优先队列中元素的个数
q.push(4);
q.push(5);
q.pop(); //O(logn),将堆顶元素出队,n为当前优先队列中元素的个数
cout << q.top() << endl; //O(1),获得堆顶元素
if (q.empty()) cout << "empty" << endl; //O(1)
cout << q.size() << endl; //O(1)
return 0;
}
//
4
2
1.基本类型(int,double,char)优先级的设置。
默认是数字越大优先级越高
priority_queue<int> q;
//等价于priority_queue<int, vector<int>, less<int>> q;
第二个参数是承载底层数据结构堆的数据结构。
第三个参数less<int>表示数字越大优先级越高,改成greater<int>表示数字越小优先级越高。
2.结构体优先级的设置。
struct fruit{
string name;
int price;
//只能重载'<',因为'>' 和'=='都可以用 '<'来表示。
friend bool operator< (fruit f1, fruit f2) { //加上friend!!!加上bool!!!
return f1.price < f2.price;
}
}
priority_queue<fruit> q; //price越大优先级高
3.基本数据类型是pair,优先级的设置
struct cmp {
bool operator () (const pair<int, int>& p1, const pair<int, int>& p2) const{
return p1.second < p2.second;
}
}
priority_queue<pair<int, int>, vector<pair<int, int>>, cmp> q;
适用于:
1.取出前几个最大/最小的元素(Dijkstra算法的优化,哈夫曼树带权路径长度的求解)