如何将向量 v 转换为priority_queue pq? 就像我们可以做的一样-
for(int i=0;i<(int)v.size();i++) pq.push(v[i]);
但是是否可以让它变得更加简短和简洁?
priority_queue<int>pq(begin(stones),end(stones));
如果您使用向量作为内部容器(这是默认的),那么您可以简单地使用以下构造函数:
template< class Alloc > priority_queue( const Compare& compare, const Container& cont, const Alloc& alloc );
否则,您可以使用接受一对迭代器的构造函数:
template< class InputIt > priority_queue( InputIt first, InputIt last, const Compare& compare = Compare(), Container&& cont = Container() );
构造函数可以从另一个容器初始化优先级队列,例如
std::vector
。您还可以选择是否需要最大堆 (std::greater
) 或最小堆(std::less
,默认值)。
这里我使用了C++17的类模板参数推导来尽可能简化声明。
#include <functional>
#include <iostream>
#include <queue>
#include <vector>
int main() {
auto print_pq = [](auto& pq) {
for (std::cout << "pq : "; !pq.empty(); pq.pop()) {
std::cout << pq.top() << ' ';
}
std::cout << std::endl;
};
std::vector<int> init_list{1, 2, 3};
{
// max heap
std::cout << "max heap: \n";
std::priority_queue<int> max_heap_1{init_list.begin(), init_list.end()};
print_pq(max_heap_1);
std::priority_queue max_heap_2(std::less<int>(), init_list);
print_pq(max_heap_2);
}
{
// min heap
std::cout << "min heap: \n";
std::priority_queue<int, std::vector<int>, std::greater<int>> min_heap_1{
init_list.begin(), init_list.end()};
print_pq(min_heap_1);
std::priority_queue min_heap_2{init_list.begin(), init_list.end(),
std::greater<int>()};
print_pq(min_heap_2);
std::priority_queue min_heap_3(std::greater<int>(), init_list);
print_pq(min_heap_3);
}
}