为什么C++类内使用自定义比较器的priority_queue会触发报错?
核心报错原因
std::priority_queue的第三个模板参数要求传入比较器的类型,而非具体的函数实例。你直接把函数名comparator作为模板参数传入,属于语法错误。- 类内部的静态成员函数在类内引用时,需要补全类作用域,不能直接写函数名,如类名为
YourClass,完整函数名应为YourClass::comparator。 - 你定义的比较器参数为非常量左值引用
pair<int, int> &,不符合STL容器对比较器的要求:比较器必须支持接收常量参数,需要给参数加const修饰。 - 额外注意:比较器的定义顺序必须在队列声明的代码之前,否则编译器无法识别对应的符号。
修复方案
方案1:以函数作为比较器
首先修正比较器的参数修饰:
static bool comparator(const pair<int, int> &m, const pair<int, int> &n) { return m.second < n.second; }
声明队列时,模板参数传入函数类型,构造函数传入实际的比较器实例:
// 假设当前类名为YourClass priority_queue<pair<int, int>, vector<pair<int, int>>, decltype(&YourClass::comparator)> pq(YourClass::comparator);
方案2:以函数对象(仿函数)作为比较器(更推荐)
直接在类内定义比较器类型,无需额外传实例给构造函数,性能更优:
// 类内定义比较器类型 struct comparator { bool operator()(const pair<int, int> &m, const pair<int, int> &n) const { return m.second < n.second; } }; // 声明队列时直接传入比较器类型即可 priority_queue<pair<int, int>, vector<pair<int, int>>, comparator> pq;
内容的提问来源于stack exchange,提问作者LGDGODV
相关产品推荐
相关产品推荐

