【C++ 面试 - STL】每日 3 题(四)

✍个人博客:Pandaconda-CSDN博客
📣专栏地址:http://t.csdnimg.cn/fYaBd
📚专栏简介:在这个专栏中,我将会分享 C++ 面试中常见的面试题给大家~
❤️如果有收获的话,欢迎点赞👍收藏📁,您的支持就是我创作的最大动力💪

10. STL 中的 heap 的实现

heap(堆)并不是 STL 的容器组件,是 priority queue(优先队列)的底层实现机制,因为 binary max heap(大根堆)总是最大值位于堆的根部,优先级最高。
binary heap 本质是一种 complete binary tree(完全二叉树),整棵 binary tree 除了最底层的叶节点之外,都是填满的,但是叶节点从左到右不会出现空隙,如下图所示就是一颗完全二叉树:
[图片]

完全二叉树内没有任何节点漏洞,是非常紧凑的,这样的一个好处是可以使用 array 来存储所有的节点,因为当其中某个节点位于i处,其左节点必定位于 2i 处,右节点位于 2i+1 处,父节点位于 i/2(向下取整)处。这种以 array 表示 tree 的方式称为隐式表述法。
因此我们可以使用一个 array 和一组 heap 算法来实现 max heap(每个节点的值大于等于其子节点的值)和 min heap(每个节点的值小于等于其子节点的值)。由于 array 不能动态的改变空间大小,用 vector 代替 array 是一个不错的选择。
那 heap 算法有哪些?常见有的插入、弹出、排序和构造算法,下面一一进行描述。
push_heap 插入算法
由于完全二叉树的性质,新插入的元素一定是位于树的最底层作为叶子节点,并填补由左至右的第一个空格。事实上,在刚执行插入操作时,新元素位于底层 vector 的 end() 处,之后是一个称为 percolate up(上溯)的过程,举个例子如下图:
在这里插入图片描述
新元素 50 在插入堆中后,先放在 vector 的 end() 存着,之后执行上溯过程,调整其根结点的位置,以便满足 max heap 的性质,如果了解大根堆的话,这个原理跟大根堆的调整过程是一样的。
pop_heap 算法
heap 的 pop 操作实际弹出的是根节点吗,但在 heap 内部执行 pop_heap 时,只是将其移动到 vector 的最后位置,然后再为这个被挤走的元素找到一个合适的安放位置,使整颗树满足完全二叉树的条件。这个被挤掉的元素首先会与根结点的两个子节点比较,并与较大的子节点更换位置,如此一直往下,直到这个被挤掉的元素大于左右两个子节点,或者下放到叶节点为止,这个过程称为 percolate down(下溯)。举个例子:
在这里插入图片描述
根节点 68 被 pop 之后,移到了 vector 的最底部,将 24 挤出,24 被迫从根节点开始与其子节点进行比较,直到找到合适的位置安身,需要注意的是 pop 之后元素并没有被移走,如果要将其移走,可以使用 pop_back()。
sort 算法
一言以蔽之,因为 pop_heap 可以将当前 heap 中的最大值置于底层容器 vector 的末尾,heap 范围减 1,那么不断的执行 pop_heap 直到树为空,即可得到一个递增序列。
make_heap 算法
将一段数据转化为 heap,一个一个数据插入,调用上面说的两种 percolate 算法即可。
代码实测:

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;int main()
{vector<int> v = { 0,1,2,3,4,5,6 };make_heap(v.begin(), v.end()); //以vector为底层容器for (auto i : v){cout << i << " "; // 6 4 5 3 1 0 2}cout << endl;v.push_back(7);push_heap(v.begin(), v.end());for (auto i : v){cout << i << " "; // 7 6 5 4 1 0 2 3}cout << endl;pop_heap(v.begin(), v.end());cout << v.back() << endl; // 7 v.pop_back();for (auto i : v){cout << i << " "; // 6 4 5 3 1 0 2}cout << endl;sort_heap(v.begin(), v.end());for (auto i : v){cout << i << " "; // 0 1 2 3 4 5 6}return 0;
}

11. STL 中的 priority_queue 的实现

priority_queue,优先队列,是一个拥有权值观念的 queue,它跟 queue 一样是顶部入口,底部出口,在插入元素时,元素并非按照插入次序排列,它会自动根据权值(通常是元素的实值)排列,权值最高,排在最前面,如下图所示。
在这里插入图片描述
默认情况下,priority_queue 使用一个 max-heap 完成,底层容器使用的是一般为 vector 为底层容器,堆 heap 为处理规则来管理底层容器实现 。priority_queue 的这种实现机制导致其不被归为容器,而是一种容器配接器。关键的源码如下:

template <class T, class Squence = vector<T>, 
class Compare = less<typename Sequence::value_tyoe> >
class priority_queue{...
protected:Sequence c; // 底层容器Compare comp; // 元素大小比较标准
public:bool empty() const {return c.empty();}size_type size() const {return c.size();}const_reference top() const {return c.front()}void push(const value_type& x){c.push_back(x);push_heap(c.begin(), c.end(),comp);}void pop(){pop_heap(c.begin(), c.end(),comp);c.pop_back();}
};

priority_queue 的所有元素,进出都有一定的规则,只有 queue 顶端的元素(权值最高者),才有机会被外界取用,它没有遍历功能,也不提供迭代器。
举个例子:

#include <queue>
#include <iostream>
using namespace std;int main()
{int ia[9] = {0,4,1,2,3,6,5,8,7 };priority_queue<int> pq(ia, ia + 9);cout << pq.size() <<endl;  // 9for(int i = 0; i < pq.size(); i++){cout << pq.top() << " "; // 8 8 8 8 8 8 8 8 8}cout << endl;while (!pq.empty()){cout << pq.top() << ' ';// 8 7 6 5 4 3 2 1 0pq.pop();}return 0;
}

12. STL 中 set 的实现?

STL 中的容器可分为序列式容器(sequence)和关联式容器(associative),set 属于关联式容器。
set 的特性是,所有元素都会根据元素的值自动被排序(默认升序),set 元素的键值就是实值,实值就是键值,set 不允许有两个相同的键值。
set 不允许迭代器修改元素的值,其迭代器是一种 constance iterators。
标准的 STL set 以 RB-tree(红黑树)作为底层机制,几乎所有的 set 操作行为都是转调用 RB-tree 的操作行为,这里补充一下红黑树的特性:

  • 每个节点不是红色就是黑色
  • 根结点为黑色
  • 如果节点为红色,其子节点必为黑
  • 任一节点至(NULL)树尾端的任何路径,所含的黑节点数量必相同
    关于红黑树的具体操作过程,比较复杂读者可以翻阅《算法导论》详细了解。
    举个例子:
#include <set>
#include <iostream>
using namespace std;int main()
{int i;int ia[5] = { 1,2,3,4,5 };set<int> s(ia, ia + 5);cout << s.size() << endl; // 5cout << s.count(3) << endl; // 1cout << s.count(10) << endl; // 0s.insert(3); //再插入一个3cout << s.size() << endl; // 5cout << s.count(3) << endl; // 1s.erase(1);cout << s.size() << endl; // 4set<int>::iterator b = s.begin();set<int>::iterator e = s.end();for (; b != e; ++b)cout << *b << " "; // 2 3 4 5cout << endl;b = find(s.begin(), s.end(), 5);if (b != s.end())cout << "5 found" << endl; // 5 foundb = s.find(2);if (b != s.end())cout << "2 found" << endl; // 2 foundb = s.find(1);if (b == s.end())cout << "1 not found" << endl; // 1 not foundreturn 0;
}

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

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

相关文章

qiankun微前端

qiankun微前端踩坑指南&#xff1a; 上图原因子项目未启动 上图使用$tqiankun微前端中未引用i18n插件解决方案如下&#xff1a; 子项目main.js中加上i18n: 一些坑忘记截图复现会继续更新....... 配置正文开始------> 主项目 子项目 1.名字需要与子项目跳转后缀一致 2.v…

景联文科技:提供高质量多模态数据标注,推动智能化转型

随着人工智能技术的快速发展&#xff0c;多模态数据标注成为推动智能系统更深层次理解和应用的关键技术之一。 作为行业领先的多模态数据标注服务商&#xff0c;景联文科技凭借其在技术、流程和人才方面的综合优势&#xff0c;推出了全面的多模态标注解决方案&#xff0c;助力…

Python | Leetcode Python题解之第392题判断子序列

题目&#xff1a; 题解&#xff1a; class Solution:def isSubsequence(self, s: str, t: str) -> bool:n, m len(s), len(t)f [[0] * 26 for _ in range(m)]f.append([m] * 26)for i in range(m - 1, -1, -1):for j in range(26):f[i][j] i if ord(t[i]) j ord(a) el…

【5G PHY】5G循环前缀(CP)设计思路简述

博主未授权任何人或组织机构转载博主任何原创文章&#xff0c;感谢各位对原创的支持&#xff01; 博主链接 本人就职于国际知名终端厂商&#xff0c;负责modem芯片研发。 在5G早期负责终端数据业务层、核心网相关的开发工作&#xff0c;目前牵头6G技术研究。 博客内容主要围绕…

将语义分割的标签转换为实例分割(yolo)的标签

语义分割的标签&#xff08;目标处为255&#xff0c;其余处为0&#xff09; 实例分割的标签&#xff08;yolo.txt&#xff09;,描述边界的多边形顶点的归一化位置 绘制在原图类似蓝色的边框所示。 废话不多说&#xff0c;直接贴代码&#xff1b; import os import cv2 imp…

监控平台总结之面试常问答案

思路 延伸的面试题总结及答案&#xff1a; 1.说说前端监控平台/监控SDK架构设计和难点亮点&#xff1f; 架构设计 数据采集层: SDK: 在前端集成的 SDK 负责采集数据&#xff0c;包括性能指标、用户行为、错误日志等。 数据收集: 实现高效的数据采集机制&#xff0c;支持实时…

分类任务实现模型集成代码模版

分类任务实现模型&#xff08;投票式&#xff09;集成代码模版 简介 本实验使用上一博客的深度学习分类模型训练代码模板-CSDN博客&#xff0c;自定义投票式集成&#xff0c;手动实现模型集成&#xff08;投票法&#xff09;的代码。最后通过tensorboard进行可视化&#xff0…

傅里叶变换家族

禹晶、肖创柏、廖庆敏《数字图像处理&#xff08;面向新工科的电工电子信息基础课程系列教材&#xff09;》 禹晶、肖创柏、廖庆敏《数字图像处理》资源二维码

java设计模式(行为型模式:状态模式、观察者模式、中介者模式、迭代器模式、访问者模式、备忘录模式、解释器模式)

6&#xff0c;行为型模式 6.5 状态模式 6.5.1 概述 【例】通过按钮来控制一个电梯的状态&#xff0c;一个电梯有开门状态&#xff0c;关门状态&#xff0c;停止状态&#xff0c;运行状态。每一种状态改变&#xff0c;都有可能要根据其他状态来更新处理。例如&#xff0c;如果…

太细了有手就行,SpringCloud Alibaba+Nacos+Dubbo整合

SpringCloud AlibabaNacosDubbo&#xff0c;文末有完整项目代码链接 前言一、这几者之间关系二、准备工作1.Nacos2.SpringCloud Alibaba4.SpringCloud5.Dubbo项目中层级关系 三、代码调用逻辑1.dubbo-api模块2.account-api模块3.api-service模块4.逻辑梳理 四、Maven和配置1.pa…

尽快更新!Zyxel 路由器曝出 OS 命令注入漏洞,影响多个版本

近日&#xff0c;Zyxel 发布安全更新&#xff0c;以解决影响其多款商用路由器的关键漏洞&#xff0c;该漏洞可能允许未经认证的攻击者执行操作系统命令注入。 该漏洞被追踪为 CVE-2024-7261&#xff0c;CVSS v3 得分为 9.8&#xff0c;是一个输入验证故障&#xff0c;由用户提…

了解PD快充协议和QC快充协议

PD快充协议的实现依赖充电器与设备之间的通信协议&#xff0c;这种通信协议确保了充电器能够提供设备所需要的特定电压和电流。在快充技术中快充协议起到关键角色。 现在市面上最常见的快充协议有PD、QC、华为FCP/SCP、三星AFC协议 、VOOC闪充。PD和QC 协议属于公用协议 。华…

CSS 高级区块效果——WEB开发系列25

CSS提供了多种工具和属性&#xff0c;使我们能够创建视觉上引人注目的效果。今天我们继续将深入了解几种高级CSS效果&#xff1a;盒子阴影、滤镜、混合模式和文本背景裁剪&#xff0c;提升网页设计的质感和深度。 一、盒子阴影&#xff08;Box Shadow&#xff09; 对于盒子元素…

学会这2招,让你轻松提取长视频中的文案!

在当今数字化时代&#xff0c;短视频已成为备受欢迎的内容形式&#xff0c;众多品牌和营销人员借助短视频推广宣传产品。 短视频文案作为短视频内容的关键部分&#xff0c;能够在极短时间内向受众传达品牌信息和产品特点。 不过&#xff0c;短视频文案的提取和创作确实极具挑…

ceph中pg与pool关系

在Ceph中&#xff0c;PG&#xff08;Placement Group&#xff09;和Pool是非常重要的概念&#xff0c;它们在Ceph的存储架构中扮演着关键角色。理解这些概念有助于更好地管理和优化Ceph集群。下面详细介绍这两个概念及其相互关系。 Pool&#xff08;存储池&#xff09; 定义&am…

【重学 MySQL】十二、SQL 语言的规则与规范

【重学 MySQL】十二、SQL 语言的规则与规范 基本规则注释语法规则命名规则基本命名规则具体命名规范其他注意事项 数据导入指令 SQL&#xff08;Structured Query Language&#xff0c;结构化查询语言&#xff09;的规则与规范是确保SQL语句能够正确执行、提高代码可读性和可维…

【2024数模国赛赛题思路公开】国赛C题第三套思路丨无偿自提

C题参考思路 C题是一道优化问题&#xff0c;目的是根据题目所给的种植限制条件以及附件数据建立目标条件优化模型&#xff0c;优化种植策略&#xff0c;有利于方便田间管理&#xff0c;提高生产效益&#xff0c;减少各种不确定因素可能造成的种植风险。整个题目最重要的问题在…

Java框架第四课(对Spring的补充Spring web)

目录 一.Spring web的认识 (1)Spring Web概念 (2)Spring web的特点 (3)Springweb运行的流程 (4)Springweb运行的流程图 二.搭建Spring web 三.自定义处理器类搭建 (1)处理器类配置 (2)处理器类接受请求 (3)获得请求数据 四.拦截器 (1)关于拦截器&#xff1a; (2)拦截器的…

Axure中继器动态数据图表制作

在Axure RP中&#xff0c;中继器&#xff08;Repeater&#xff09;是一个非常强大的工具&#xff0c;它允许设计者动态地展示和交互数据&#xff0c;进而创建各种复杂的数据可视化图表&#xff0c;如柱状图、条形图、堆叠图、散点图和对比图。以下将详细介绍如何使用中继器来设…

持续集成与持续部署(CI/CD)的深入探讨

在现代软件开发中&#xff0c;持续集成&#xff08;CI&#xff09;和持续部署&#xff08;CD&#xff09;已成为不可或缺的实践。这些方法旨在加快软件交付的速度&#xff0c;同时提高软件的质量和稳定性。通过CI/CD&#xff0c;开发团队可以频繁地将代码更改集成到主分支&…