gpt4 book ai didi

c++ - 带有自定义比较器的 C++ 中的 priority_queue

转载 作者:搜寻专家 更新时间:2023-10-31 00:54:46 25 4
gpt4 key购买 nike

我创建了一个 priority_queue 并定义了一个自定义比较器(一个结构),它在构造函数中采用一个 2D vector 。它编译并成功运行到声明该优先级队列的程度。但是,如果我尝试将一个元素添加到优先级队列中,它会弹出错误消息:

错误:请求'minHeap'中的成员'push',它是非类类型'std::priority_queue, std::vector >, MyComparator>(MyComparator)' minHeap.push(make_pair(0, 1));

我想知道是什么问题?

#include <iostream>
#include <vector>
#include <queue>
using namespace std;



struct MyComparator{
vector<vector<int>> array2D;

MyComparator(const vector<vector<int>>& arrays){
array2D = arrays;
}

bool operator()(const pair<int, int> &p1, const pair<int, int> &p2){
return array2D[p1.second][p1.first] > array2D[p2.second][p2.first];
}
};


int main() {
vector<vector<int>> arrays = {{1, 3, 5, 7}, {2, 4, 6},{0, 8, 9, 10, 11}};
priority_queue<pair<int, int>, vector<pair<int, int>>, MyComparator> minHeap(MyComparator(arrays));

//运行良好,上面没有错误

    minHeap.push(make_pair(0, 1)); //pop me error
return 0;
}

最佳答案

这是因为您的优先级队列初始化被视为函数声明而不是变量声明。参见 https://en.wikipedia.org/wiki/Most_vexing_parse至于为什么。

将您初始化优先级队列的行更改为此

priority_queue<pair<int, int>, vector<pair<int, int>>, MyComparator> minHeap{MyComparator(arrays)}; 

它应该可以正常工作。

它现在起作用的原因是 {} 不再模糊。 {} 是在 C++11 中作为构造对象的一种方式引入的,在许多情况下它比圆括号更适合初始化变量。有关更多信息,请参阅 Why is list initialization (using curly braces) better than the alternatives?

注意 为了将来,永远记得在启用警告标志的情况下进行编译。通常推荐的是-Werror-Wall-pedantic。当您启用这些标志时,编译器会提醒您注意代码中存在的歧义(最令人烦恼的解析)。

关于c++ - 带有自定义比较器的 C++ 中的 priority_queue,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44192654/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com