C++中为queue自定义比较规则时出现编译错误的求助
问题分析与解决
首先,你的核心误区是混淆了C++中queue和priority_queue的用法,以及模板参数的含义:
- 普通
queue是先进先出(FIFO)的容器,本身不支持自定义排序,它的第二个模板参数是底层存储容器(比如std::deque,默认值),不是比较器。 - 如果需要实现有序的队列,应该使用
std::priority_queue,它才是基于堆结构实现的优先级队列,支持自定义排序规则。
另外,你的比较器也存在两个问题:
- 参数应该用
const Pet&传递,避免不必要的对象拷贝,提升效率。 - 用
a.id - b.id作为返回值存在溢出风险,直接用关系运算符(</>)更安全且语义明确。
修正后的代码
#include <iostream> #include <queue> #include <vector> using namespace std; enum owner { A, B }; class Pet { public: int b, e, id; owner o; }; // 比较器:按id升序排列(小顶堆),如果要大顶堆则返回a.id < b.id struct cmp { bool operator()(const Pet& a, const Pet& b) const { return a.id > b.id; } }; int main() { // priority_queue的模板参数:<元素类型, 底层容器类型, 比较器类型> // 底层容器默认是vector,这里可以省略不写 priority_queue<Pet, vector<Pet>, cmp> Q; // 测试示例:添加元素 Pet p1 = {1, 2, 3, A}; Pet p2 = {4, 5, 1, B}; Pet p3 = {6, 7, 2, A}; Q.push(p1); Q.push(p2); Q.push(p3); // 输出会按id升序:1, 2, 3 while (!Q.empty()) { cout << Q.top().id << endl; Q.pop(); } return 0; }
关键说明
priority_queue的模板参数顺序:- 第一个参数是存储的元素类型(
Pet) - 第二个参数是底层存储容器(必须是支持随机访问的容器,比如
vector、deque,默认是vector) - 第三个参数是比较器类型(
cmp),用于定义优先级规则:比较器返回true时,第一个参数的优先级低于第二个参数,会被放在堆的下方。
- 第一个参数是存储的元素类型(
- 比较器的
operator()必须是const成员函数,因为priority_queue会在const上下文中调用它。
内容的提问来源于stack exchange,提问作者codexistent
相关产品推荐
相关产品推荐

