You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++中为queue自定义比较规则时出现编译错误的求助

问题分析与解决

首先,你的核心误区是混淆了C++中queue和priority_queue的用法,以及模板参数的含义:

  • 普通queue是先进先出(FIFO)的容器,本身不支持自定义排序,它的第二个模板参数是底层存储容器(比如std::deque,默认值),不是比较器。
  • 如果需要实现有序的队列,应该使用std::priority_queue,它才是基于堆结构实现的优先级队列,支持自定义排序规则。

另外,你的比较器也存在两个问题:

  1. 参数应该用const Pet&传递,避免不必要的对象拷贝,提升效率。
  2. 用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;
}

关键说明

  1. priority_queue的模板参数顺序:
    • 第一个参数是存储的元素类型(Pet)
    • 第二个参数是底层存储容器(必须是支持随机访问的容器,比如vector、deque,默认是vector)
    • 第三个参数是比较器类型(cmp),用于定义优先级规则:比较器返回true时,第一个参数的优先级低于第二个参数,会被放在堆的下方。
  2. 比较器的operator()必须是const成员函数,因为priority_queue会在const上下文中调用它。

内容的提问来源于stack exchange,提问作者codexistent

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 06:42:47