c++的queue中有一种优先队列 他会自动按要求递增或者递减排序
在写一些算法题的时候可以起到很好的辅助作用
今天给大家简单介绍一下这些
优先队列
既然是队列那么先要包含头文件#include ,
他和queue不同的就在于我们可以自定义其中数据的优先级, 让优先级高的排在队列前面,优先出队
优先队列也具有普通队列的所有的特性 比如size等等 其本质是用堆实现的 所以又称为最大(小)堆
定义
priority_queue<Type,Container,Functional>
其中:
Type是数据类型
Container是容器类型(Container必须是用数组实现的容器,比如vector等默认为vector
Functional就是比较的方式,也是我们后边实现排序的重要角色
当我们不声明任何的时候,默认是大顶堆
priority_queue<int, vector<int>, greater<int>> q;//升序
priority_queue<int, vector<int>, less<int>> q;//降序
//greater和less是std中实现的两个仿函数
例子
int main() {
//auto cmp = [&](const auto& a, const auto& b) {
// return a.first + a.second < b.first + b.second;
//};
priority_queue<int, vector<int>, greater<int>> q1;//升序
priority_queue<int, vector<int>, less<int>> q2;//降序
//greater和less是std中实现的两个仿函数
vector<int> nums = { 3,5,9,1,6,7,4 };
for (int i = 0; i < nums.size(); i++) {
q1.push(nums[i]);
q2.push(nums[i]);
}
while (!q1.empty()) {
cout << q1.top() << " ";
q1.pop();
}
cout << endl;
while (!q2.empty()) {
cout << q2.top() << " ";
q2.pop();
}
return 0;
}
我们可以观察一下运行结果
可见最大最小的排序对于字母上边没有给出例子 但是升序降序和数字是一样的
对于pair的排序
auto cmp = [&](const auto& a, const auto& b) {
return a.first < b.first ;
//first+second之和小的在后大的在前
};
vector < pair<int, int>> pairs;
for (int i = 0; i < 5; i++) {
pair<int, int> a;
a.first = i + 1;
a.second = 5 - i;
pairs.push_back(a);
}
cout << "排序前:" << endl;
for (auto pair:pairs) {
cout << pair.first << " " << pair.second << " | ";
}
priority_queue < pair<int, int>, vector<pair<int, int>>, decltype(cmp)> PairQueue(cmp);
//decltype是自动识别类型
for (auto pair : pairs) {
PairQueue.push(pair);
}
cout << endl;
cout << "排序后:" << endl;
while (!PairQueue.empty()) {
auto pair = PairQueue.top();
cout << pair.first << " " << pair.second << " | ";
PairQueue.pop();
}
return 0;
我们可以通过这种方式对于pair中任何想要的想要的结果设计cmp
这就是我所介绍的全部内容 希望对大家有帮助