C++中堆(优先队列)的使用
1.priority_queue默认使用最大堆,例如:
std::priority_queue<int> q;
上面这条语句声明了一个最大堆。
2.最大堆与最小堆的声明:
priority_queue<>默认是大根堆的,这是因为优先队列队首指向最后,队尾指向最前面的缘故
也就是一个数组,如果用std::less
排序(用<连接元素),优先队列的顶部一直都在数组末尾。
// 最小堆
std::priority_queue<int, std::vector<int>, std::greater<int> > q2;
// 最大堆
std::priority_queue<int, std::vector<int>, std::less<int> > q2;
3.自定义比较函数,生成不同的最大堆和最小堆
// Using lambda to compare elements.
auto cmp = [](int left, int right) {
return (left) < (right);}; // 大的数排前面
std::priority_queue<int, std::vector<int>, decltype(cmp)> q3(cmp);
4.cppreference上的例子(经过修改)
#include <functional>
#include <queue>
#include <vector>
#include <iostream>
template<typename T> void print_queue(T& q) {
while(!q.empty()) {
std::cout << q.top() << " ";
q.pop();
}
std::cout << '\n';
}
int main() {
std::priority_queue<int> q;
for(int n : {
1,8,5,6,3,4,0,9,7,2})
q.push(n);
print_queue(q);
std::priority_queue<int, std::vector<int>, std::greater<int> > q2;
for(int n : {
1,8,5,6,3,4,0,9,7,2})
q2.push(n);
print_queue(q2);
// Using lambda to compare elements.
auto cmp = [](int left, int right) {
return (left ) < (right );};
std::priority_queue<int, std::vector<int>, decltype(cmp)> q3(cmp);
for(int n : {
1,8,5,6,3,4,0,9,7,2})
q3.push(n);
print_queue(q3);
}
最后的输出结果:
9 8 7 6 5 4 3 2 1 0
0 1 2 3 4 5 6 7 8 9
9 8 7 6 5 4 3 2 1 0
C++中map的知识
map默认是以从小到大的方式排序的,代码例子:
// constructing maps
#include