C++ priority_queue怎么用_C++优先队列底层实现与自定义比较器

C++中的priority_queue是基于堆实现的容器适配器,默认为大根堆,提供push、pop、top等操作,时间复杂度为O(log n),可通过std::greater或自定义比较器实现小根堆或自定义优先级,适用于Dijkstra、任务调度等场景。

c++ priority_queue怎么用_c++优先队列底层实现与自定义比较器

C++ 中的 priority_queue 是一个基于堆结构实现的容器适配器,用于快速获取最大(或最小)元素。它默认是一个大根堆,即队头始终是当前优先级最高的元素。本文将介绍它的基本用法、底层实现原理以及如何使用自定义比较器。

基本用法与常见操作

priority_queue 定义在 queue 头文件中,使用方式如下:

#include #include // 默认大根堆std::priority_queue pq;pq.push(10);pq.push(30);pq.push(20);std::cout << pq.top();  // 输出 30pq.pop();std::cout << pq.top();  // 输出 20

常用成员函数包括:

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

底层实现原理

priority_queue 底层基于 堆(heap) 实现,通常使用 vectordeque 作为存储结构。标准库通过 make_heap、push_heap 和 pop_heap 等算法维护堆性质。

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

每次 push 操作会将元素插入尾部,然后向上调整(上浮)以保持堆序;pop 则将首尾交换后弹出,并向下调整(下沉)恢复堆结构。这两个操作的时间复杂度均为 O(log n)。

由于 priority_queue 是容器适配器,不能直接遍历,也不提供迭代器。

自定义比较器

默认情况下,priority_queue 使用 std::less 构造大根堆。若要改为小根堆,可指定比较器为 std::greater

std::priority_queue<int, std::vector, std::greater> min_pq;min_pq.push(10);min_pq.push(5);min_pq.push(15);std::cout << min_pq.top();  // 输出 5

对于自定义类型(如结构体),可以重载比较函数或传入函数对象:

struct Person {    int age;    std::string name;};// 方式一:重载 operator<bool operator<(const Person& a, const Person& b) {    return a.age < b.age;  // 年龄大的优先}std::priority_queue pq;pq.push({25, "Alice"});pq.push({30, "Bob"});std::cout << pq.top().name;  // 输出 Bob

也可以使用 lambda 表达式配合函数对象(需用 decltype 并传入构造参数):

auto cmp = [](const Person& a, const Person& b) {    return a.age < b.age;  // 小根堆逻辑:年龄小的优先};std::priority_queue<Person, std::vector, decltype(cmp)> pq(cmp);

基本上就这些。掌握 priority_queue 的使用和比较器设计,能有效应对涉及优先级调度、Dijkstra 算法、合并 K 个有序链表等典型问题。理解其堆基础也有助于分析性能和调试行为。

以上就是C++ priority_queue怎么用_C++优先队列底层实现与自定义比较器的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1486776.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月19日 10:07:30
下一篇 2025年12月19日 10:07:45

相关推荐

  • C++怎么实现一个红黑树_C++高级数据结构与平衡二叉搜索树

    红黑树通过颜色属性和旋转操作保持平衡,其插入删除遵循特定规则以确保O(log n)效率。 红黑树是一种自平衡的二叉搜索树,通过在每个节点上增加一个“颜色”属性(红色或黑色),并遵循一套严格的规则来保持树的近似平衡。C++ 中实现红黑树需要理解其结构定义、插入/删除操作中的旋转与颜色调整机制。 红黑树…

    2025年12月19日
    000
  • C++ virtual析构函数作用_C++基类虚析构函数防止内存泄漏

    基类析构函数应声明为虚函数以确保派生类析构函数被正确调用,防止资源泄漏。 在C++中,当通过基类指针删除派生类对象时,如果基类的析构函数不是虚函数,那么只会调用基类的析构函数,而不会调用派生类的析构函数。这可能导致派生类中分配的资源未被正确释放,从而引发内存泄漏或资源泄漏。 虚析构函数的作用 将基类…

    2025年12月19日
    000
  • c++如何实现观察者设计模式_c++行为型设计模式实战

    观察者模式定义了一种一对多的依赖关系,让多个观察者对象同时监听一个主题对象,当主题状态改变时自动通知所有观察者进行更新;其核心角色包括Subject(维护观察者列表并负责注册、移除和通知)和Observer(定义更新接口),通过C++示例展示了具体实现结构,包含ConcreteSubject和Con…

    2025年12月19日
    000
  • C++如何使用CMake构建项目_C++ CMakeLists.txt编写入门教程

    首先给出明确答案,CMake是C++项目中主流的构建系统生成工具,通过编写CMakeLists.txt文件生成跨平台构建文件。具体描述:文章介绍了CMake的基本使用流程,从环境准备、简单项目构建到多文件多目录管理,涵盖编译器与CMake安装验证、最小CMakeLists.txt编写、外部构建目录创…

    2025年12月19日
    000
  • C++ optional用法详解_C++17处理可能为空的返回值

    std::optional 是 C++17 引入的模板类,用于表示可能无值的情况。它封装一个值,可处于有值或无值(std::nullopt)状态,避免使用特殊值或指针表达空状态。适用于函数返回可能存在失败的场景,如查找、解析等。通过 has_value()、operator bool、value_o…

    2025年12月19日
    000
  • c++20的指定初始化(Designated Initializers)怎么用_c++ C风格结构体初始化

    C++20引入指定初始化,支持通过.成员名赋值,提升可读性与安全性;仅适用于聚合类型,不可混用非指定初始化,支持嵌套,未显式初始化成员被默认初始化。 在C++20中引入的指定初始化(Designated Initializers),允许你像C语言那样,通过字段名来初始化结构体成员,提高了代码的可读性…

    2025年12月19日
    000
  • C++ static关键字作用_C++静态成员变量与静态函数

    static关键字在C++中用于控制生命周期、作用域和类级资源共享。①用于文件作用域时,限制变量或函数仅在本编译单元可见,实现内部链接;②静态成员变量属于类所有实例共享,需在类外定义初始化,可通过类名访问,常用于统计对象数等场景;③静态成员函数无this指针,不依赖对象实例,可直接通过类名调用,适用…

    2025年12月19日
    000
  • C++ unordered_map与map的区别_C++哈希表与红黑树的性能对比

    map基于红黑树实现,元素有序,操作时间复杂度为O(log n);unordered_map基于哈希表,无序,平均操作速度O(1),最坏O(n)。前者适合需顺序访问场景,后者适用于追求高效查找且无需排序的场合。内存方面,unordered_map通常更高。选择依据具体需求:有序性选map,高速查找选…

    2025年12月19日
    000
  • c++如何使用std::thread::join和detach_c++线程生命周期管理

    在C++多线程编程中,必须对std::thread对象调用join或detach以避免程序异常终止。1. join用于等待线程结束,适用于需同步或获取结果的场景;2. detach使线程后台运行,适用于无需控制的异步任务,但需确保资源生命周期安全;3. thread析构前必须非joinable,推荐…

    2025年12月19日
    000
  • c++如何掌握指针的核心用法_c++指针入门到精通指南

    指针是存储内存地址的变量,通过取地址符&获取变量地址,解引用*访问地址中的值,数组名本质是指向首元素的指针,可用指针遍历数组。 指针是C++中最强大也最容易让人困惑的特性之一。掌握它,就等于掌握了内存操作的核心能力。理解指针的关键不在于记住语法,而在于建立“内存地址”和“数据访问”的直观认知…

    2025年12月19日
    000
  • C++ bind函数使用教程_C++参数绑定与函数适配器的应用

    答案是std::bind用于绑定函数参数生成新可调用对象,定义在functional头文件中,基本语法为std::bind(function, arg1, arg2, …),其中function为可调用对象,参数可为实际值或占位符,占位符也定义在functional中。 在C++中,st…

    2025年12月19日
    000
  • c++如何实现一个简单的RPC框架_c++远程过程调用原理与实践

    RPC框架的核心是让开发者像调用本地函数一样调用远程服务,通过代理隐藏网络细节。1. 客户端调用本地存根,将函数名和参数序列化为JSON字节流。2. 通过TCP发送至服务端,服务端反序列化后查表找到对应函数执行。3. 执行结果序列化回传,客户端解析并返回结果。4. 框架包含Server、Client…

    2025年12月19日
    000
  • c++类和对象到底是什么_c++面向对象编程基础

    类是C++中定义对象属性和行为的模板,对象是类的实例;通过封装、构造函数与析构函数实现数据隐藏与资源管理,提升代码可维护性。 C++中的类和对象是面向对象编程(OOP)的核心概念。理解它们,是掌握C++编程的关键一步。简单来说,类是一种自定义的数据类型,用来描述具有相同属性和行为的一组事物;而对象是…

    2025年12月19日
    000
  • c++如何链接Boost库_c++准标准库的集成与使用

    正确集成Boost需分清头文件与二进制库:1. 通过包管理器或源码安装Boost;2. 头文件库直接包含即可;3. 二进制库需指定路径并链接,注意依赖顺序;4. 推荐使用CMake自动配置,提升可移植性。 在C++项目中使用Boost库,需要完成编译、链接和包含三个步骤。Boost被称为“准标准库”…

    2025年12月19日
    000
  • c++中的const关键字用法大全_c++ const正确使用指南

    const用于声明不可变变量、函数参数等,提高安全性和可读性;修饰基本类型时值不可变,替代宏定义更安全;与指针结合有三种情况:const指针、指向const的指针、指向const的const指针,理解“谁是const”关键;函数参数用const引用避免拷贝和修改;const成员函数保证不修改对象状态…

    2025年12月19日
    000
  • C++中的explicit关键字有什么作用_C++类型转换控制与explicit使用

    explicit关键字用于禁止隐式类型转换,增强类型安全:①修饰单参数构造函数时,防止参数类型自动转为类对象;②C++11后可用于转换运算符,如explicit operator bool(),限制仅显式转换;建议所有单参构造函数和类型转换运算符使用explicit,避免意外行为。 在C++中,ex…

    2025年12月19日
    000
  • C++ cast类型转换总结_C++ reinterpret_cast与const_cast的使用

    reinterpret_cast用于低层次类型重解释,const_cast用于修改const/volatile属性;前者适用于指针与整数间转换,后者仅能调整对象的可变性,二者均需谨慎使用以避免未定义行为。 在C++中,类型转换是编程过程中常见的操作。为了提高类型安全性和代码可读性,C++引入了四种显…

    2025年12月19日
    000
  • C++中std::thread和std::async的区别_C++并发编程与线程与异步任务比较

    std::thread 用于直接控制线程,需手动管理同步与生命周期;std::async 提供异步任务抽象,返回 future 获取结果并自动管理资源。 在C++并发编程中,std::thread 和 std::async 都用于实现多线程执行,但它们的设计目的、使用方式和资源管理机制有明显区别。理…

    2025年12月19日
    000
  • c++如何使用Tracy进行性能剖析_c++实时帧分析器入门

    Tracy 是一个轻量且高效的 C++ 实时性能剖析工具,支持细粒度 CPU 与 GPU 性能追踪,适用于游戏和图形应用。通过集成 TracyClient.cpp 和 TracyClient.hpp 到项目中,并定义 TRACY_ENABLE 宏,即可启用性能监控。使用 ZoneScoped 可自动…

    2025年12月19日
    000
  • C++ this指针指向什么_C++成员函数隐式参数深入理解

    this指针指向调用成员函数的对象,是编译器传递的隐式参数。它用于区分同名变量、实现链式调用,如返回*this支持连续操作。 在C++中,this指针是一个隐藏的指针,它指向调用成员函数的那个对象。每当一个类的成员函数被调用时,编译器会自动将该对象的地址作为隐式参数传递给这个函数,而this指针就是…

    2025年12月19日
    000

发表回复

登录后才能评论
关注微信