制作数组c ++的最小优先级队列

Posted

技术标签:

【中文标题】制作数组c ++的最小优先级队列【英文标题】:Make min priority queue of arrays c++ 【发布时间】:2020-05-17 10:39:48 【问题描述】:

我想要一个最小优先级队列,它不包含整数,而是存储数组。每个元素的优先级是数组中的第一个元素。

priority_queue<array<int, 6>, vector<int>, greater<int>> pq;
array<int, 6> arr = a, b, c, d, e, f;
pq.push(arr);
array<int, 6> popArr = pq.pop();

当我这样做时,我收到以下与推送相关的错误:

no matching function for call to ‘std::priority_queue<std::array<int, 6>, std::vector<int>, std::greater<int> >::push(std::array<int, 6>&)’
 pq.push(arr);

以下与弹出有关:

conversion from ‘void’ to non-scalar type ‘std::array<int, 6>’ requested
 array<int, 6> popArr = pq.pop();

如何解决这些错误?

【问题讨论】:

1) 你在哪里定义比较两个数组的第一个元素的比较器? 2) pop 不返回任何内容,因此您的分配 = pq.pop() 没有任何意义。你检查过documentation吗? 3) 优先级队列数组的底层容器如何是std::vector&lt;int&gt;?您的优先级队列的值类型是 std::array&lt;int, 6&gt;,因此底层容器和比较器都必须反映这一点。 【参考方案1】:

首先优先级队列中的数据结构类型是array,所以vector应该写成vector>。

现在第三个参数是比较器。所以让我们创建一个比较器:

struct Compare
    bool operator()(array<int,6> a,array<int,6> b)
    return a[0]>b[0];

;

现在声明如下:

priority_queue<array<int,6>, vector<array<int,6>, Compare > pq;

另外,pq.pop()的返回类型是void,所以应该是pq.top()然后写pq.pop()来移除元素优先队列。

【讨论】:

【参考方案2】:

来自[container.adaptors]

容器适配器的第一个模板参数T应表示与Container​::​value_­type相同的类型。

您需要std::priority_queue&lt;std::array&lt;int, 6&gt;, std::vector&lt;std::array&lt;int, 6&gt;&gt;, greater_first&gt;,其中greater_first 是带有bool operator()(const std::array&lt;int, 6&gt; &amp;, const std::array&lt;int, 6&gt; &amp;) 的类型,例如

struct greater_first 
    bool operator()(const std::array<int, 6> & lhs, const std::array<int, 6> & rhs) const 
        return lhs[0] > rhs[0];
    
;

另外,pop 返回void,所以你必须取popping 之前的第一个元素

auto popArr = pq.top();
pq.pop();

【讨论】:

以上是关于制作数组c ++的最小优先级队列的主要内容,如果未能解决你的问题,请参考以下文章

线性表--08---优先队列

最小堆(优先队列)基本概念,即一个完整建立,插入,删除代码

C语言实现一个优先队列

最小n个和(优先队列)

使用优先级队列的 K 排序数组 - C++

c struct queue error:“数组类型具有不完整的元素类型”