如何不传入显式Compare对象,从Container构造std::priority_queue实例
现有标准下的实现方式
你可以使用迭代器范围构造函数,无需显式传入比较器即可从已有std::vector构造优先级队列:
std::vector<int> vec; // 填充vec的元素 std::priority_queue<int> pq(vec.begin(), vec.end());
如果需要移动容器元素避免拷贝,C++23及更高版本已经正式支持你提到的仅接受容器的构造函数重载,可以直接编写如下代码:
// C++23 起合法 std::priority_queue<int> pq(std::move(vec));
未提供对应构造函数的原因
这个问题属于C++标准库的历史设计疏漏:
- C++98最初设计
std::priority_queue时,所有接收容器参数的构造函数都将比较器参数放在参数列表的前位,没有额外设计仅传容器、使用默认比较器的重载,当时的设计优先照顾了自定义比较器的场景,忽略了使用默认比较器的高频场景。 - 后续C11新增移动语义、C17完善类模板推导的迭代过程中,都没有及时补上这两个重载,直到C++23标准才正式将这两个构造函数加入规范,填补了这个设计缺口。
内容的提问来源于stack exchange,提问作者Semisonic
相关产品推荐
相关产品推荐

