使用此 Java 代码的 std::priority_queue (C++ STL) 的 C++ 等价物是什么

What is the C++ equivalent using std::priority_queue (C++ STL) of this Java code

基本上,它将是向量的最小堆,其中优先级基于向量的索引 1(从 0 开始)。

PriorityQueue<int[]> pq = new PriorityQueue<>((a, b) -> (a[1] - b[1]));

我试过了

priority_queue<<vector<int>, vector<vector<int>>, [](vector<int> a[1], vector<int> b[1]){
return a[1] < b[1];
}>

队列的元素是向量,因此这是相互比较的对象类型。 vector<int> a[1] 不是向量,而是长度为 1 的向量数组(尽管作为函数参数,在这种情况下它将被调整为指向该数组元素的指针,即指向向量的指针)。因此,比较对象的参数类型与容器的元素类型不匹配,因此是错误的。

解决它的一种方法是将参数更改为对队列的 const 限定元素的引用 - 您将需要使用引用以避免在每次比较时不必要地复制向量。但也许更简单的是使用 auto 以便像 Java 示例中那样推导类型:

auto cmp = [](const auto& a, const auto& b) {
    return a[1] < b[1];
}

此外,比较对象不是模板参数。模板参数是比较对象的类型。最后,您的示例缺少变量名称。一个固定的例子:

priority_queue<vector<int>, vector<vector<int>>, decltype(cmp)> pq(cmp);

对于最大类型推导,您可以使用接受底层容器作为参数的构造函数:

vector<vector<int>> v; // you may optionally populate the queue here
priority_queue pq {cmp, std::move(v)};

找到解决方案:

struct comparator { 
    bool operator()(pair<int,int> const& a, pair<int,int> const& b) 
    { 
        return a.second > b.second;
    } 
}; 
priority_queue<pair<int,int>,vector<pair<int,int>>,comparator>Q;

如果你真的想使用 lambda 作为比较器,通常的做法是这样

auto cmp = [](vector<int> a, vector<int> b) { return a[0] < b[0]; };

priority_queue<vector<int>, vector<vector<int>>, decltype(cmp)> Q(cmp);

通常比较器的参数是 const vector<int>& 类型,但那是另一回事了。