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

如何为std::priority_queue预分配内存?比较器构造匹配错误求解

解决std::priority_queue构造时的"No matching constructor"错误

这个问题的核心原因是你没显式指定std::priority_queue的第三个模板参数(比较器类型),导致构造函数的参数类型不匹配。我来给你拆解原因和解决办法:

问题根源

std::priority_queue的默认模板参数定义是这样的:

template <class T, class Container = vector<T>, class Compare = less<T>>
class priority_queue;

当你只指定前两个参数时,第三个参数默认是std::less<long long int>。但你构造时传入的是std::greater<long long int>(),这时候编译器找不到参数类型匹配的构造函数——因为它期望的比较器类型是默认的std::less,而你传入的是std::greater,两者类型不兼容。

修正后的代码

你只需要显式把比较器类型作为第三个模板参数传入即可:

std::vector<long long int> container;
container.reserve(dimension);
// 显式指定第三个模板参数为std::greater<long long int>
std::priority_queue<long long int, std::vector<long long int>, std::greater<long long int>> 
    queue(std::greater<long long int>(), std::move(container));

自定义比较器的适配方法

如果是使用自定义比较器,同样需要把它作为第三个模板参数声明,比如:

// 自定义比较器:按绝对值从小到大排序
struct AbsAscComparator {
    bool operator()(const long long int& lhs, const long long int& rhs) {
        return std::abs(lhs) > std::abs(rhs);
    }
};

// 声明时指定自定义比较器类型
std::priority_queue<long long int, std::vector<long long int>, AbsAscComparator> 
    custom_queue(AbsAscComparator(), std::move(container));

简化写法补充

如果你的比较器支持默认构造(比如std::greater或上面的自定义比较器),还可以省略构造时的比较器对象传入:

std::priority_queue<long long int, std::vector<long long int>, std::greater<long long int>> 
    queue(std::move(container));

这时候会自动使用比较器的默认构造对象来完成初始化。

内容的提问来源于stack exchange,提问作者Kastus' Hradzinsky

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 03:36:57