使用此 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>&
类型,但那是另一回事了。
基本上,它将是向量的最小堆,其中优先级基于向量的索引 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>&
类型,但那是另一回事了。