STL c++ 中的 Priority_queue 向量

问题描述 投票:0回答:3

如何将向量 v 转换为priority_queue pq? 就像我们可以做的一样-

for(int i=0;i<(int)v.size();i++) pq.push(v[i]);

但是是否可以让它变得更加简短和简洁?

c++ vector stl priority-queue
3个回答
1
投票
priority_queue<int>pq(begin(stones),end(stones));

0
投票

如果您使用向量作为内部容器(这是默认的),那么您可以简单地使用以下构造函数:

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() );

0
投票

std::priority_queue有不同的

构造函数
可以从另一个容器初始化优先级队列,例如
std::vector
。您还可以选择是否需要最大堆 (
std::greater
) 或最小堆(
std::less
,默认值)。

Coliru 直播

这里我使用了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);
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.