值得一看
广告
彩虹云商城
广告

热门广告位

c++如何使用std::priority_queue_c++优先队列容器使用详解

std::priority_queue是C++中基于堆的容器适配器,默认为最大堆,可通过std::greater或自定义比较实现最小堆及复杂优先级逻辑,常用于Top K、Dijkstra等场景。

c++如何使用std::priority_queue_c++优先队列容器使用详解

在C++中,std::priority_queue 是一个基于堆结构实现的容器适配器,用于自动维护元素的优先级顺序。默认情况下,它是一个最大堆,即每次取出的元素是当前队列中最大的。下面详细介绍其基本用法、自定义比较方式以及常见应用场景。

基本用法

std::priority_queue 定义在 <queue> 头文件中,使用时需要包含该头文件。其模板参数有三个,但通常只使用前两个:

  • T:存储元素的数据类型
  • Container:底层容器类型,默认为 std::vector<T>
  • Compare:比较函数对象,默认为 std::less<T>(最大堆)

基本声明方式如下:


priority_queue pq; // 最大堆,顶部是最大值

常用操作接口:

立即学习“C++免费学习笔记(深入)”;

  • pq.push(x):插入元素 x
  • pq.pop():删除堆顶元素(不返回)
  • pq.top():返回堆顶元素
  • pq.empty():判断是否为空
  • pq.size():返回元素个数

示例代码:


#include <queue>
#include <iostream>
using namespace std;

int main() {
    priority_queue pq;
    pq.push(10);
    pq.push(30);
    pq.push(20);

    while (!pq.empty()) {
        cout << pq.top() << ” “;
        pq.pop();
    }
    // 输出:30 20 10
    return 0;
}

创建最小堆

默认是最大堆,若要实现最小堆,可以使用 std::greater 作为比较函数:


priority_queue, greater> min_pq;

此时堆顶是当前最小元素。示例:


min_pq.push(10);
min_pq.push(30);
min_pq.push(20);
cout << min_pq.top(); // 输出 10

自定义比较函数(结构体或类)

当处理自定义类型(如结构体)时,需要提供比较逻辑。可以通过重载 operator< 或定义比较结构体实现。

AI图像编辑器

AI图像编辑器

使用文本提示编辑、变换和增强照片

AI图像编辑器46

查看详情
AI图像编辑器

方法一:重载 operator<


struct Person {
    int age;
    string name;
    bool operator<(const Person& p) const {
        return age < p.age; // 年龄大的优先级高(最大堆)
    }
};

priority_queue pq;
pq.push({25, “Alice”});
pq.push({30, “Bob”});
cout << pq.top().name; // 输出 Bob

方法二:自定义比较结构体(推荐用于复杂逻辑)


struct Compare {
    bool operator()(const Person& a, const Person& b) {
        return a.age < b.age; // 最大堆
    }
};

priority_queue, Compare> pq;

注意:在自定义比较结构体中,如果想让某个值“优先级更高”,需理解:返回 true 表示 a 的优先级低于 b,即 b 应该更靠近堆顶。例如使用 less 时,a < b 意味着 a 在 b 下面。

常见应用场景

std::priority_queue 常用于以下场景:

  • 堆排序:利用堆特性进行高效排序
  • Dijkstra 算法:取出距离最短的节点
  • Huffman 编码:合并频率最小的两棵树
  • Top K 问题:维护前 K 个最大/最小值

例如求 Top K 最小元素,可以用最大堆维护 K 个元素:


priority_queue pq; // 最大堆
for (int x : nums) {
    if (pq.size() < k) {
        pq.push(x);
    } else if (x < pq.top()) {
        pq.pop();
        pq.push(x);
    }
}

基本上就这些。std::priority_queue 使用简单,配合自定义比较能应对大多数优先级调度需求,不需要手动维护堆结构,效率高且不易出错。

相关标签:

编码 ai c++ ios stream less 数据类型 String if for while include const 结构体 bool int 接口 堆 using Struct operator Namespace 对象 算法

大家都在看:

c++中如何处理UTF-8编码_c++字符编码转换与处理技巧
c++中的拷贝省略(copy elision)是什么_编译器优化下的拷贝省略机制详解
c++如何实现多线程编程_c++多线程实现方法
c++如何使用预处理指令(#ifdef, #define)_c++条件编译与宏定义技巧
c++怎么创建和使用动态链接库(DLL/SO)_c++动态库的创建、编译与调用方法
温馨提示: 本文最后更新于2025-10-31 22:29:33,某些文章具有时效性,若有错误或已失效,请在下方留言或联系在线客服
文章版权声明 1 本网站名称: 创客网
2 本站永久网址:https://new.ie310.com
1 本文采用非商业性使用-相同方式共享 4.0 国际许可协议[CC BY-NC-SA]进行授权
2 本站所有内容仅供参考,分享出来是为了可以给大家提供新的思路。
3 互联网转载资源会有一些其他联系方式,请大家不要盲目相信,被骗本站概不负责!
4 本网站只做项目揭秘,无法一对一教学指导,每篇文章内都含项目全套的教程讲解,请仔细阅读。
5 本站分享的所有平台仅供展示,本站不对平台真实性负责,站长建议大家自己根据项目关键词自己选择平台。
6 因为文章发布时间和您阅读文章时间存在时间差,所以有些项目红利期可能已经过了,能不能赚钱需要自己判断。
7 本网站仅做资源分享,不做任何收益保障,创业公司上收费几百上千的项目我免费分享出来的,希望大家可以认真学习。
8 本站所有资料均来自互联网公开分享,并不代表本站立场,如不慎侵犯到您的版权利益,请联系79283999@qq.com删除。

本站资料仅供学习交流使用请勿商业运营,严禁从事违法,侵权等任何非法活动,否则后果自负!
THE END
喜欢就支持一下吧
点赞10赞赏 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容