我正在使用 C++ 中的priority_queue,并在使用静态成员函数作为类中的自定义比较器时遇到问题。
一个可重现的例子是:
#include <bits/stdc++.h>
using namespace std;
class testClass {
private:
static bool comp(const int& a, const int& b) {
return a > b;
}
priority_queue<int, vector<int>, decltype(&testClass::comp)> q;
public:
void push(int num) {
q.push(num);
}
};
int main() {
testClass t;
t.push(0);
t.push(0);
return 0;
}
第二次调用
push
会导致错误。我认为这意味着成员函数comp
不能被q
调用。
但是,当我将成员函数更改为类外部的 lambda 函数,然后使用
decltype(comp)
引用它时,代码可以正常工作。
有人可以解释为什么静态成员函数会导致这个问题,以及为什么 lambda 方法可以起作用吗?
问题不在于您使用静态成员函数作为比较器。问题是你不使用它。
std::priority_queue<int, vector<int>, decltype(&comp)> q;
比较器不会传递给构造函数,并且使用一个默认构造函数(null)。
您应该将比较器传递给构造函数
std::priority_queue<int, vector<int>, decltype(&comp)> q{comp};
我打赌一定有重复的问题,但我找不到它。