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
相关产品推荐
相关产品推荐

