学会吊打面试官之容器终篇priority_queue

news2025/5/28 1:11:08

小白:大牛您好,我即将毕业需要找工作,但是我对于常用容器的特点和用法不是很清楚,能否跟我聊聊呢?

大牛:没问题,我很乐意帮助你。常用容器有 vector、list、set、map 和 priority_queue。其中,vector、list、set 和 map 是常用的基础容器,而 priority_queue 则是一个高级容器,主要用于实现优先队列。

小白:那么它们的特点和用法分别是什么呢?

大牛:vector 是一个动态数组,支持随机访问和快速插入和删除。list 是一个双向链表,支持快速插入和删除,但是不支持随机访问。set 是一个有序集合,支持快速查找和插入,但是不支持重复元素。map 是一个有序键值对集合,支持通过键快速查找值,但是不支持重复键。而 priority_queue 则是一个基于堆的优先队列,支持快速插入和获取队列中的最大元素。

小白:听起来好像很厉害的样子,可以给我一些具体的案例来帮助我理解吗?

大牛:当然可以。假设你需要实现一个程序,用于记录学生成绩,并能够根据成绩排名。你可以使用 vector 来存储学生信息,使用 sort 函数来对学生成绩进行排序。另外,如果你需

要支持快速删除学生信息,你可以使用 list 来代替 vector。

小白:那么如果我需要实现一个程序,用于统计文章中单词的出现次数,应该使用哪种容器?

大牛:你可以使用 map 来实现。把每个单词作为键,把单词出现的次数作为值。每次读取一个单词,就在 map 中增加对应单词的计数值。这样就可以统计文章中单词的出现次数了。

小白:那么 priority_queue 底层是如何实现的呢?

大牛:priority_queue 是一种用于实现优先队列的容器,它的底层实现通常是使用堆(heap)数据结构。

小白:堆?我还不太了解。

大牛:堆是一种特殊的树形数据结构,它满足两个条件:堆的根节点是堆中所有元素中的最大值或最小值;堆中任意节点的值总是大于等于(或小于等于)其子节点的值。这种满足条件的堆被称为大根堆或小根堆。

小白:我大概理解了,那么 priority_queue 底层是如何使用堆来实现的呢?

大牛:priority_queue 通常使用 STL 中的 vector 或 deque 作为底层容器,并且默认情况下是使用大根堆。在插入元素时,会将元素放在底层容器的末尾,然后进行上浮操作,将元素与其父节点比较,如果比父节点大,则将其与父节点交换位置,直到满足堆的条件为止。在弹出元素时,会将堆顶元素与底层容器的末尾元素交换位置,然后进行下沉操作,将元素与其子节点比较,如果比子节点小,则将其与子节点交换位置,直到满足堆的条件为止。

下面是一个使用 priority_queue 的示例代码:

#include <iostream>
#include <queue>

using namespace std;

int main() {
    priority_queue<int> pq;

    pq.push(5);
    pq.push(3);
    pq.push(8);
    pq.push(1);

    while (!pq.empty()) {
        cout << pq.top() << " ";
        pq.pop();
    }

    return 0;
}

还有这个,下面是一个使用 priority_queue 实现最小元素堆的例子:

#include <iostream>
#include <queue>
#include <vector>

using namespace std;

int main() {
    vector<int> nums = { 5, 8, 2, 10, 3 };
    priority_queue<int, vector<int>, greater<int>> pq;

    // 将 vector 中的元素插入 priority_queue 中
    for (auto num : nums) {
        pq.push(num);
    }

    // 从 priority_queue 中取出最小元素并打印
    while (!pq.empty()) {
        cout << pq.top() << " ";
        pq.pop();
    }

    return 0;
}

 

在这个例子中,我们首先定义了一个 vector 存储整数,并且定义了一个 priority_queue 来存储这些整数。由于我们希望得到最小元素,我们在定义 priority_queue 时使用了 greater<int> 作为比较器。接下来,我们将 vector 中的元素逐个插入 priority_queue 中,然后从 priority_queue 中取出最小元素并打印。最终的输出结果应该是:2 3 5 8 10。

小白:非常感谢您的讲解,我对常用容器的特点和用法以及 priority_queue 的底层实现有了更深入的了解。

小白:好的,我会的。不过,我还有一个问题,您能不能再讲讲 STL 中其他的常用容器?

大牛:当然可以。除了 vector、list、deque 和 priority_queue,还有很多其他的容器。比如:

  • set 和 multiset:用于存储不重复的元素,并且可以按照一定规则进行排序。
  • map 和 multimap:用于存储键值对,并且可以按照键进行排序。map 中的键是唯一的,而 multimap 中的键可以重复。
  • unordered_set 和 unordered_multiset:与 set 和 multiset 类似,但是不保证元素的顺序,而是使用哈希表进行快速查找。
  • unordered_map 和 unordered_multimap:与 map 和 multimap 类似,但是不保证元素的顺序,而是使用哈希表进行快速查找。

小白:听起来很多啊,这些容器都有什么特点和用法呢?

大牛:set 和 map 是有序的容器,使用红黑树作为底层实现。set 可以用于快速查找一个元素是否存在,map 可以用于快速查找一个键对应的值。multiset 和 multimap 可以存储重复的元素或键。这些容器的插入、查找和删除操作的时间复杂度都是 O(log n)。

unordered_set 和 unordered_map 是无序的容器,使用哈希表作为底层实现。它们的插入、查找和删除操作的时间复杂度都是 O(1),但是在遍历容器时,元素的顺序是不确定的。如果需要存储无序的元素或键值对,并且需要快速查找,那么就可以选择使用 unordered_set 和 unordered_map。

multiset、multimap、unordered_multiset 和 unordered_multimap 的使用方法和 set、map、unordered_set 和 unordered_map 相似,只是在插入、查找和删除元素时需要注意重复元素或键的情况。

小白:哇,听起来好复杂啊。不过,我会尝试去理解和使用它们的。谢谢您的讲解。

大牛:不用谢,你可以多看看 STL 的文档和一些实际的例子,这样会更容易理解。如果有问题,随时来问我。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/413059.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux中你必须掌握的CPU load

文章目录1. 查看CPU load2.CPU load含义2.1 单核CPU2.2 多核CPU3. 获得系统的CPU信息1. 查看CPU load uptimeloadd average后的三个数字分别代表1分钟、5分钟、15分钟的负载情况平均值 2.CPU load含义 CPU load是一段时间内CPU正在处理以及等待CPU处理的进程数之和的统计信息…

ESP32设备驱动-SHT20温湿度传感器驱动

SHT20温湿度传感器驱动 文章目录 SHT20温湿度传感器驱动1、SHT20介绍2、硬件准备3、软件准备4、驱动实现1、SHT20介绍 Sensirion 的 SHT20 湿度和温度传感器已成为外形尺寸和智能方面的行业标准:嵌入在 3 x 3mm 封装和 1.1mm 高度的可回流焊双扁平无引线 (DFN) 封装中,它提供…

2023年的深度学习入门指南(3) - 动手写第一个语言模型

2023年的深度学习入门指南(3) - 动手写第一个语言模型 上一篇我们介绍了openai的API&#xff0c;其实也就是给openai的API写前端。在其它各家的大模型跟gpt4还有代差的情况下&#xff0c;prompt工程是目前使用大模型的最好方式。 不过&#xff0c;很多编程出身的同学还是对于…

HTML5 音频 Audio

文章目录HTML5 音频 Audio互联网上的音频浏览器支持HTML5 Audio - 如何工作音频格式及浏览器支持音频格式的MIME类型HTML5 Audio 标签HTML5 音频 Audio HTML5 提供了播放音频文件的标准。 互联网上的音频 直到现在&#xff0c;仍然不存在一项旨在网页上播放音频的标准。 今天…

【2023】某python语言程序设计跟学第七周内容

目录1.文件的使用1.1.文件的类型1.2.文件的打开和关闭1.3.文件内容的读取1.4.文件内容的写入2.实例&#xff1a;自动轨迹绘制3.一维数据格式化和处理3.1.数据组织维度3.2.一维数据的表示3.3.一维数据的存储3.4.一维数据的处理4.二维数据格式化和处理4.1.二位数据的表示4.2.CSV格…

在 Python 中制作一个字母列表

要列出字母表&#xff1a; 使用 string.ascii_lowercase 属性获取字母表中的字母字符串。使用 list() 类将字符串转换为列表。该列表将包含字母表中的所有字母。 import string# ✅ 获取字母表中小写字母的列表 lower string.ascii_lowercase list_of_lowercase_letters li…

【python数据分析】对乐高、奥特曼、高达进行分析,看看哪个卖的最好

前言 嗨喽~大家好呀&#xff0c;这里是魔王呐 ❤ ~! 前期准备 软件&#xff1a; Jupyter Notebook&#xff1a; 是一个开源的web应用程序&#xff0c;可以使用它来创建和共享包含实时代码、方程、可视化和文本的文档。 Jupyter Notebook是IPython项目的一个派生项目&#x…

基于K-最近邻算法构建鸢尾花分类模型

基于K-最近邻算法构建鸢尾花分类模型 一 任务描述 鸢尾花&#xff08;Iris&#xff09;数据集是机器学习中一个经典的数据集。假设有一名植物学爱好者收集了150朵鸢尾花的测量数据&#xff1a;花瓣的长度和宽度以及花萼的长度和宽度&#xff0c;这些花已经鉴定为属于Setosa、…

多线程 之 CAS与synchronized的优化过程

前言 本篇介绍什么是CAS与synchronized的优化过程&#xff0c;如有错误&#xff0c;请在评论区指正&#xff0c;让我们一起交流&#xff0c;共同进步&#xff01; 文章目录前言1. 什么是CAS&#xff1f;2. CAS实现的操作2.1 实现原子类2.2 实现自旋锁3. CAS的aba问题4. synchr…

QT桌面的构建

文章目录 前言一、按键类的创建二、按键样式设计三、详细代码讲解总结前言 本篇文章开始我将带大家构建一个属于自己的QT桌面,这个桌面将适用于ARM和Linux等。 一、按键类的创建 首先我们需要创建一个按键类,这个按键类需要包含一个按键和一个lable用来显示按键的名字。 效…

2022MathorCup赛题B

以下所有文字均基于作者的实际经验&#xff0c;并不具有完全的合理性&#xff0c;请谨慎参考 目录 一、问题分析 &#xff08;一&#xff09;问题一 &#xff08;二&#xff09;问题二 二、预处理 &#xff08;一&#xff09;训练集预处理 &#xff08;二&#xff09;测…

逻辑回归预测泰坦尼克号乘客生存率

逻辑回归预测泰坦尼克号乘客生存率 描述 RMS泰坦尼克号的沉没是历史上最臭名昭着的沉船之一。1912年4月15日&#xff0c;在她的处女航中&#xff0c;泰坦尼克号在与冰山相撞后沉没&#xff0c;在2224名乘客和机组人员中造成1502人死亡。这场耸人听闻的悲剧震惊了国际社会&…

Segment Anything文章要点

核心方法: 1. 数据 Unfortunately, there is no web-scale data source for segmentation; to address this, we build a “data engine” 没有大规模的数据源用于分割; 为了解决这个问题&#xff0c;我们构建了一个“数据引擎” We iterate between using our efficient mo…

SpringBoot整合MongoDB

参考链接 https://www.mongodb.org.cn/ 文章目录一、前言1.1 NoSQL介绍1.1.1 NoSQL 数据库分类1.1.2 NoSQL的优点/缺点1.1.3 BASE1.2 MongoDB介绍1.2.1 MongoDB和SQL对比1.2.2 数据库1.2.3 元数据1.2.4 MongoDB 数据类型二、SpringBoot整合MongDB2.1 环境配置2.2 MongoTemplate…

chatGPT如何助力devops

随着软件开发行业的不断发展&#xff0c;DevOps已成为软件开发的主流方法。DevOps是一种将开发和运维工作结合起来的实践&#xff0c;旨在提高软件交付速度和质量&#xff0c;以及优化整个软件开发过程。最近&#xff0c;聊天机器人技术的崛起为DevOps带来了全新的变革&#xf…

【MySQL】(1)数据库基础,库与表的增删查改,数据库的备份与还原

文章目录服务器&#xff0c;数据库&#xff0c;表关系MySQL 数据存储逻辑SQL 分类存储引擎库的操作查看数据库创建数据库查看创建语句删除数据库选择&#xff08;切换&#xff09;数据库查看当前选择的数据库修改数据库字符集和排序规则表的操作创建表查询表查询表结构插入数据…

2、Git使用不完全指南:Git客户端的使用及使用Token认证方式提交代码详解(详细图文)

本篇介绍如何在Windows、Linux下安装Git客户端以及从远程代码仓库拉取代码。以及介绍2023如何从GitHub上获取Token令牌、使用Pycharm通过Token令牌从本地push上传仓库的方法&#xff0c;用来解决推送代码报Push failed The requested URL returned error:403的错误问题。 安装…

通讯录的实现(初级版本)

思维导图&#xff1a; 目录 思维导图&#xff1a; ​编辑 一&#xff0c;实现通讯录的第一步——实现逻辑 二&#xff0c;头文件内实现的内容 三&#xff0c;contect.c文件内的函数定义 3.1初始化通讯录:void InitContect(cotect*pc) 3.2:实现通讯录内容的增加&#xff…

投稿指南【NO.14】SCI期刊推荐(mdpi旗下)

写在前面&#xff1a;SCI论文发表是我国高校机构与基地评估、成果评奖、项目立项、人才培养等方面的重要考核指标&#xff0c;更不要要说关系到我们个人的毕业、晋升和前途。SCI含金量之高&#xff0c;要是读研读博科研工作期间能发表&#xff0c;将对直博、找工作、国奖申请、…

04 | 连接池:别让连接池帮了倒忙

04 | 连接池&#xff1a;别让连接池帮了倒忙 连接池一般对外提供获得连接、归还连接的接口给客户端使用&#xff0c;并暴露最小空闲连接数、最大连接数等可配置参数&#xff0c;在内部则实现连接建立、连接心跳保持、连接管理、空闲连接回收、连接可用性检测等功能。 注意鉴…