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

C++中如何将不同比较器的priority_queue作为函数参数传递

解决不同比较器的priority_queue元素转移动问题

你遇到的错误根源在于:priority_queue<int>是默认实例化类型(即priority_queue<int, vector<int>, less<int>>),而使用greater<int>的priority_queue是完全不同的模板实例化类。C++中不同模板参数生成的类属于不同类型,因此普通函数无法同时匹配这两种参数类型。

使用模板函数可以直接解决这个问题,让模板自动推导两个priority_queue的比较器类型,无需手动编写四种组合的函数。

基础实现方案

针对int类型和vector底层容器的场景,编写如下模板函数:

#include <queue>
#include <vector>

template <typename CompareFrom, typename CompareTo>
void transfer(std::priority_queue<int, std::vector<int>, CompareFrom>& from, 
              std::priority_queue<int, std::vector<int>, CompareTo>& to) {
    // 必须判断源队列非空,避免调用top()/pop()导致未定义行为
    if (!from.empty()) {
        int val = from.top();
        from.pop();
        to.push(val);
    }
}

调用方式

直接传入任意组合的priority_queue即可,编译器会自动推导模板参数:

int main() {
    std::priority_queue<int, std::vector<int>, std::less<int>> pq1;
    std::priority_queue<int, std::vector<int>, std::greater<int>> pq2;

    pq1.push(3);
    pq1.push(1);
    pq1.push(2);

    // 无需指定模板参数,直接调用
    transfer(pq1, pq2);

    return 0;
}

更通用的泛型版本

如果需要支持任意元素类型和底层容器,可以扩展模板以适配更多场景:

template <typename T, typename Container, typename CompareFrom, typename CompareTo>
void transfer(std::priority_queue<T, Container, CompareFrom>& from, 
              std::priority_queue<T, Container, CompareTo>& to) {
    if (!from.empty()) {
        T val = from.top();
        from.pop();
        to.push(val);
    }
}

这个版本可以处理priority_queue<double, std::deque<double>, std::greater<double>>这类非int元素、非vector容器的场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 23:47:10