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

news2024/9/22 19:22:26

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

7. 标题STL 中 list 的实现

相比于 vector 的连续线型空间,list 显得复杂许多,但是它的好处在于插入或删除都只作用于一个元素空间,因此 list 对空间的运用是十分精准的,对任何位置元素的插入和删除都是常数时间。list 不能保证节点在存储空间中连续存储,也拥有迭代器,迭代器的 “++”、“–” 操作对于的是指针的操作,list 提供的迭代器类型是双向迭代器:Bidirectional iterators。
list 节点的结构见如下源码:

template <class T>
struct __list_node{
    typedef void* void_pointer;
    void_pointer prev;
    void_pointer next;
    T data;
}

从源码可看出 list 显然是一个双向链表。list 与 vector 的另一个区别是,在插入和接合操作之后,都不会造成原迭代器失效,而 vector 可能因为空间重新配置导致迭代器失效。
此外 list 也是一个环形链表,因此只要一个指针便能完整表现整个链表。list 中 node 节点指针始终指向尾端的一个空白节点,因此是一种 “前闭后开” 的区间结构。
list 的空间管理默认采用 alloc 作为空间配置器,为了方便的以节点大小为配置单位,还定义一个 list_node_allocator 函数可一次性配置多个节点空间。
由于 list 的双向特性,其支持在头部(front)和尾部(back)两个方向进行 push 和 pop 操作,当然还支持 erase,splice,sort,merge,reverse,sort 等操作,这里不再详细阐述。

8. STL 中的 deque 的实现

vector 是单向开口(尾部)的连续线性空间,deque 则是一种双向开口的连续线性空间,虽然 vector 也可以在头尾进行元素操作,但是其头部操作的效率十分低下(主要是涉及到整体的移动)。
在这里插入图片描述
deque 和 vector 的最大差异一个是 deque 运行在常数时间内对头端进行元素操作,二是 deque 没有容量的概念,它是动态地以分段连续空间组合而成,可以随时增加一段新的空间并链接起来
deque 虽然也提供随机访问的迭代器,但是其迭代器并不是普通的指针,其复杂程度比 vector 高很多,因此除非必要,否则一般使用 vector 而非 deque。如果需要对 deque 排序,可以先将 deque 中的元素复制到 vector 中,利用 sort 对 vector 排序,再将结果复制回 deque。
deque 由一段一段的定量连续空间组成,一旦需要增加新的空间,只要配置一段定量连续空间拼接在头部或尾部即可,因此 deque 的最大任务是如何维护这个整体的连续性。
deque 的数据结构如下:

class deque
{
    ...
protected:
    typedef pointer* map_pointer;//指向map指针的指针
    map_pointer map;//指向map
    size_type map_size;//map的大小
public:
    ...
    iterator begin();
    itertator end();
    ...
}

在这里插入图片描述
deque 内部有一个指针指向 map,map 是一小块连续空间,其中的每个元素称为一个节点 node,每个 node 都是一个指针,指向另一段较大的连续空间,称为缓冲区,这里就是 deque 中实际存放数据的区域,默认大小 512 bytes。整体结构如上图所示。
deque 的迭代器数据结构如下:

struct __deque_iterator
{
    ...
    T* cur;//迭代器所指缓冲区当前的元素
    T* first;//迭代器所指缓冲区第一个元素
    T* last;//迭代器所指缓冲区最后一个元素
    map_pointer node;//指向map中的node
    ...
}

从 deque 的迭代器数据结构可以看出,为了保持与容器联结,迭代器主要包含上述 4 个元素:
在这里插入图片描述
deque 迭代器的 “++”、“–” 操作是远比 vector 迭代器繁琐,其主要工作在于缓冲区边界,如何从当前缓冲区跳到另一个缓冲区,当然 deque 内部在插入元素时,如果 map 中 node 数量全部使用完,且 node 指向的缓冲区也没有多余的空间,这时会配置新的 map(2 倍于当前 +2 的数量)来容纳更多的 node,也就是可以指向更多的缓冲区。在 deque 删除元素时,也提供了元素的析构和空闲缓冲区空间的释放等机制。

9. STL 中 stack 和 queue 的实现

stack
stack(栈)是一种先进后出(First In Last Out)的数据结构,只有一个入口和出口,那就是栈顶,除了获取栈顶元素外,没有其他方法可以获取到内部的其他元素,其结构图如下:
stack 这种单向开口的数据结构很容易由双向开口的 deque 和 list 形成,只需要根据 stack 的性质对应移除某些接口即可实现,stack 的源码如下:

template <class T, class Sequence = deque<T> >
class stack
{
    ...
protected:
    Sequence c;
public:
    bool empty(){return c.empty();}
    size_type size() const{return c.size();}
    reference top() const {return c.back();}
    const_reference top() const{return c.back();}
    void push(const value_type& x){c.push_back(x);}
    void pop(){c.pop_back();}
};

从 stack 的数据结构可以看出,其所有操作都是围绕 Sequence 完成,而 Sequence 默认是 deque 数据结构。stack 这种 “修改某种接口,形成另一种风貌” 的行为,称为 adapter(配接器)。常将其归类为 container adapter 而非 container。
stack 除了默认使用 deque 作为其底层容器之外,也可以使用双向开口的 list,只需要在初始化 stack 时,将 list 作为第二个参数即可。由于 stack 只能操作顶端的元素,因此其内部元素无法被访问,也不提供迭代器。
queue
queue(队列)是一种先进先出(First In First Out)的数据结构,只有一个入口和一个出口,分别位于最底端和最顶端,出口元素外,没有其他方法可以获取到内部的其他元素,其结构图如下:
在这里插入图片描述
类似的,queue 这种“先进先出”的数据结构很容易由双向开口的 deque 和 list 形成,只需要根据 queue 的性质对应移除某些接口即可实现,queue 的源码如下:

template <class T, class Sequence = deque<T> >
class queue
{
        ...
protected:
    Sequence c;
public:
    bool empty(){return c.empty();}
    size_type size() const{return c.size();}
    reference front() const {return c.front();}
    const_reference front() const{return c.front();}
    void push(const value_type& x){c.push_back(x);}
    void pop(){c.pop_front();}
};

从 queue 的数据结构可以看出,其所有操作都也都是是围绕 Sequence 完成,Sequence 默认也是 deque 数据结构。queue 也是一类 container adapter。
同样,queue 也可以使用 list 作为底层容器,不具有遍历功能,没有迭代器。

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

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

相关文章

2024年8月——大模型更新汇总

让我们来看一下8月份有哪些大模型更新&#xff0c;涵盖了多个领域&#xff0c;包括语言模型、视觉模型以及数学模型等。以下是本次更新的主要亮点&#xff1a; 1、 智谱系列升级&#xff1a; a、GLM-4-Flash&#xff1a;免费供应&#xff0c;提供快速响应的对话体验。 b、GLM-4…

Linux--网络指令UDP,TCPwindows连接服务器

网络指令 ping命令 用来检测网络连通性的。 比如ping 百度的官网 ping www.bai.com 这个指令执行后默认是不会停下来的&#xff0c;我们可以加入 -c 数字选项&#xff0c;表示要ping几次 比如ping两次 ping -c2 www.bai.com netstat 查看所有的网络连接活动 netstat…

《云原生安全攻防》-- K8s攻击案例:高权限Service Account接管集群

《网安面试指南》http://mp.weixin.qq.com/s?__bizMzkwNjY1Mzc0Nw&mid2247484339&idx1&sn356300f169de74e7a778b04bfbbbd0ab&chksmc0e47aeff793f3f9a5f7abcfa57695e8944e52bca2de2c7a3eb1aecb3c1e6b9cb6abe509d51f&scene21#wechat_redirect 在本节课程中…

提高编程效率的秘密武器:探索高效开发工具

&#x1f493; 博客主页&#xff1a;倔强的石头的CSDN主页 &#x1f4dd;Gitee主页&#xff1a;倔强的石头的gitee主页 ⏩ 文章专栏&#xff1a;《热点时事》 期待您的关注 目录 引言 一、工具介绍 Visual Studio Code (VS Code) Docker GitHub 二、效率对比 三、未来趋…

详细解说一下Python中的递归和基例

大家好&#xff0c;感谢阅读胡萝卜不甜的文章&#xff0c;谢谢你的关注和点赞。好戏马上开始 考点&#xff1a; 递归函数是一种在函数定义中调用自身的函数。递归函数通常包含两个主要部分&#xff1a;递归部分和基例&#xff08;也称为递归终止条件&#xff09;。 递归部分&am…

给你的头像加个口罩网站html源码

源码介绍 给你的头像加个口罩网站html源码&#xff0c;html网页源码&#xff0c;直接打开即可使用&#xff0c;也可以上传到网站。 效果预览 源码获取 给你的头像加个口罩网站html源码

【亚马逊运营经验帖】跨境选品9大实操策略,小白必看!

一个新手卖家要想在亚马逊这个庞大的平台上分得一杯羹&#xff0c;不深入了解一些选品的技巧恐怕是不行的。七分靠选品&#xff0c;三分靠运营。可见选品的成功与否对于一个 listing 能否快速爆单至关重要&#xff0c;这篇文章是从帮助小白的角度去分析选品的一些基本思路。 1…

科研论文必须要了解的25个学术网站

各位同学大家好&#xff0c;我是Toby老师&#xff0c;今天介绍一下科研论文必须要了解的25个学术网站。下述论文网站收藏内容有差异&#xff0c;大家可以检索比较。 1.SCI SCI&#xff08;Science Citation Index&#xff09;是一个学术引文数据库&#xff0c;收录了全球多个学…

《PCI Express体系结构导读》随记 —— 第II篇 第7章 PCIe总线的数据链路层与物理层(5)

接前一篇文章&#xff1a;《PCI Express体系结构导读》随记 —— 第II篇 第7章 PCIe总线的数据链路层与物理层&#xff08;4&#xff09; 7.1 数据链路层的组成结构 7.1.1 数据链路层的状态 数据链路层需要通过物理层监控PCIe链路的状态&#xff0c;并维护数据链路层的“控制与…

鸿蒙开发画廊效果

鸿蒙开发画廊效果&#xff1a; 画廊这种效果确实不错&#xff0c;看起来高端大气。在Android那边已经有不少案例了&#xff0c;但是鸿蒙这边还是很少。今天来分享一个。 先看下效果图&#xff1a; 没法弄gif,就是左右可以看到前一张&#xff0c;下一张。 也可以看我b站完整的…

C# 编译程序引用C++DLL托管动态链接库实例

构建 C# 程序引用CDLL托管动态链接库 前言1、统一框架版本2、统一编译平台3、C 托管动态链接库的优点3.1、C 托管动态链接库引用方便简单3.2、C 托管动态链接库加快了程序构建和重复利用3.3、C 托管动态链接库源代码更加安全 4、构建与 C# 程序进行互操作的C.DLL动态链接库的三…

UTB定位技术能不能精准定位

在当今科技日新月异的时代&#xff0c;定位技术以其广泛的应用场景和不断提升的精度&#xff0c;成为了多个领域的核心支撑。其中&#xff0c;UTB定位技术以其高精度、低延迟和高抗干扰性等特点&#xff0c;在众多定位技术中脱颖而出&#xff0c;成为精准定位领域的佼佼者。那么…

ContentProvider 数据供给方

作用 ContentProvider使用数据库模型的基本表格来提供需要共享的数据 表格每一行表示一条记录&#xff08;都包含"_ID"字段&#xff09;&#xff0c;每一列表示该类型的数据 URI 作用 资源的唯一标识符——提供数据位置 组成 scheme: 一般 "content:/"…

病理AI重点方向:普通HE与免疫组化之间的关系|文献速递·24-09-03

小罗碎碎念 本期推文主题&#xff1a;免疫组化 这一期的推文很有意思&#xff0c;看完第一篇文献就知道了——兽医写的与免疫组化相关的内容——普渡大学兽医学院比较病理学系。 最近一直在了解免疫组化与HE之间的关系&#xff0c;在阅读文献的时候&#xff0c;无意间看到了第…

HashMap底层逻辑理解(数组+链表+红黑树)

jdk1.7底层是由数组链表实现jdk1.8底层是由数组链表红黑树实现 以下都是数组链表红黑树对应的描述&#xff1a; public static void main(String[] args) {HashMap<String, String> map new HashMap<>();map.put("Aa", "Value1");map.put(&…

捷邻系统小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;用户管理&#xff0c;商品分类管理&#xff0c;商品信息管理&#xff0c;促销产品管理&#xff0c;订单管理&#xff0c;系统管理 微信端账号功能包括&#xff1a;系统首页&#xff0c;商品信息&#…

如何处理海量数据

目录 1.海量数据简介 海量数据的产生 海量数据的处理 2.利用位图解决 题目一 题目二 题目三 题目一变形 3.利用布隆过滤器解决 题目一 4.哈希切割解决 题目一 题目二 5.海量数据处理总结 1.海量数据简介 海量数据的产生 随着互联网的迅速发展&#xff0c;互联…

堆排、快速排序、归并排序等总结

十大经典排序算法大梳理 (动图代码)&#xff08;动态图参考&#xff09; 排序算法平均时间复杂度最差时间复杂度空间复杂度数据对象稳定性冒泡排序O(n2)O(n2)O(1)稳定选择排序O(n2)O(n2)O(1)数组不稳定、链表稳定插入排序O(n2)O(n2)O(1)稳定快速排序O(n*log2n)O(n2)O(log2n)不…

文章解读与仿真程序复现思路——电网技术EI\CSCD\北大核心《省间中长期市场连续运营下考虑耦合安全约束的电力交易联合优化出清模型》

本专栏栏目提供文章与程序复现思路&#xff0c;具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…

Docker笔记-Docker容器使用

Docker笔记-Docker容器使用 1、Docker 客户端 docker 客户端非常简单&#xff0c;我们可以直接输入 docker 命令来查看到 Docker 客户端的所有命令选项。 $ docker可以通过命令 docker command --help 更深入的了解指定的 Docker 命令使用方法。 例如我们要查看 docker sta…