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

