制作数组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<int>
?您的优先级队列的值类型是 std::array<int, 6>
,因此底层容器和比较器都必须反映这一点。
【参考方案1】:
首先优先级队列中的数据结构类型是array
现在第三个参数是比较器。所以让我们创建一个比较器:
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<std::array<int, 6>, std::vector<std::array<int, 6>>, greater_first>
,其中greater_first
是带有bool operator()(const std::array<int, 6> &, const std::array<int, 6> &)
的类型,例如
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
,所以你必须取pop
ping 之前的第一个元素
auto popArr = pq.top();
pq.pop();
【讨论】:
以上是关于制作数组c ++的最小优先级队列的主要内容,如果未能解决你的问题,请参考以下文章