C++STL细节,底层实现,面试题04

文章目录

  • 19. STL
    • 19.1. 序列容器
      • 19.1.1. vector
        • 19.1.1.1. 底层实现和特点
        • 19.1.1.2. 常用函数
        • 19.1.1.3. emplace_back() vs push_back()
      • 19.1.2. array
        • 19.1.2.1. 底层实现和特点
        • 19.1.2.2. 常用函数
      • 19.1.3. deque
        • 19.1.3.1. 底层实现和特点
        • 19.1.3.2. 常用函数
      • 19.1.4 list
        • 19.1.4.1. 底层实现和特点
        • 19.1.4.2. 常用函数
    • 19.2. 关联容器
      • 19.2.1. map
        • 19.2.1.1. 底层实现和特点
        • 19.2.1.2. 常用函数
        • 19.2.1.3. map vs unordered_map
      • 19.2.2. set
        • 19.2.2.1. 底层实现和特点
        • 19.2.2.2. 常用函数
        • 19.2.2.3. set vs unordered_set
      • 19.2.3 自定义比较函数对象,来定义元素的比较方式。
    • 19.3. 容器适配器
      • 19.3.1 queue
        • 19.3.1.1. 底层实现和特点
        • 19.3.1.2. 常用函数
      • 19.3.2 priority_queue
        • 19.3.2.1. 底层实现和特点
        • 19.3.2.2. 常用函数
      • 19.3.3 stack
        • 19.3.3.1. 底层实现和特点
        • 19.3.3.2. 常用函数

19. STL

C++标准库容器,官方文档https://learn.microsoft.com/zh-cn/cpp/standard-library/stl-containers?view=msvc-170

19.1. 序列容器

可顺序访问元素。

19.1.1. vector

19.1.1.1. 底层实现和特点
  • 底层实现为动态数组(使用数组指针),动态分配空间。连续内存空间,支持随机访问。
  • 它通过下标访问元素,时间复杂度o(1)。
  • 尾部插入和删除操作,时间复杂度o(1)。
  • 其余部分插入和删除,需要移动元素,时间复杂度o(n)。
  • 当内存空间不足时,会重新分配内存空间,扩充为原来的两倍,并拷贝原有数据。
  • 应用场景:适用于需要随机访问或频繁在序列尾部进行操作的场景。
19.1.1.2. 常用函数
  • front() 返回第一个元素的引用。
  • back() 返回最后一个元素的引用。
  • begin() 返回第一个元素的迭代器。
  • end() 返回超过末尾迭代器。
  • clear() 清空。
  • empty() 判空。
  • emplace_back() 将就地构造的元素添加到末尾。
  • push_back() 将元素添加到末尾。
  • pop_back() 删除末尾元素。
  • erase(position),erase(first,end) 删除元素。
  • insert(positon,value) 添加元素。
  • swap()交换容器元素。
  • resize(size),resize(size,value) 指定新的大小。
19.1.1.3. emplace_back() vs push_back()
  • emplace_back()的参数会使用forward<>完美转发给构造函数,然后在容器提供的位置就地构造。即只构造一次,如下图。
    在这里插入图片描述

  • push_back()的参数作为右值传入,先构造元素,再移动到末尾,即先调用构造函数,然后调用移动构造函数,如下图。
    在这里插入图片描述

  • 【注意】 emplace_back()的参数 {1,2} 会自动转换成initializer_list并进行完美转发,但vector并没有initializer_list的构造函数,所以报错。

    vector<pair<int, int>> v;v.push_back({1,2});v.emplace_back({1,2}); //报错

19.1.2. array

19.1.2.1. 底层实现和特点
  • 底层实现为数组,固定大小。连续内存空间,支持随机访问。
19.1.2.2. 常用函数
  • fill() 替换所有的元素。
  • swap() 交换容器元素。

19.1.3. deque

19.1.3.1. 底层实现和特点
  • 底层实现为中控器+缓冲区+迭代器。
    • 中控器,将分段连续的内存空间链接起来,才能在逻辑上连续,支持随机访问。使用指针数组,存放缓存区的地址。
    • 迭代器,四个指针。
      • T* cur,指向缓冲区的当前元素。
      • T* first,指向缓冲区的头。
      • T* last,指向缓存区的尾(含备用空间)。
      • T** node,指向管控中心,即缓冲区的标记位置。
  • 双端队列,首尾两端进行动态增删。
  • 相比vector和list,deque不适合遍历,因为每次访问元素,都要检查是否到达了内存片段的边界,造成了额外开销。
  • 应用场景:适用于需要频繁在序列两端进行操作的场景。
19.1.3.2. 常用函数
  • emplace_back() 将就地构造的元素添加到末尾。
  • emplace_front() 将就地构造的元素添加到开头。
  • push_back() 将元素添加到末尾。
  • push_front() 将元素添加到开头。
  • pop_back() 删除末尾元素。
  • pop_front() 删除开头元素。
  • swap() 交换容器元素。

19.1.4 list

19.1.4.1. 底层实现和特点
  • 底层实现为双链表,动态分配内存。离散内存空间,不支持随机访问。
  • 通过指针访问元素,需要遍历直至要访问的元素,时间复杂度o(n)。
  • 支持在任意位置快速插入和删除操作,时间复杂度o(1)。
  • 支持双向遍历。
  • 内存空间的使用效率并不高,一来它存放在离散而非连续的内存空间;二来它需要消耗更多内存空间来保存元素之间的关联信息。
  • 应用场景:适用于需要频繁在任意位置进行操作,但不需要随机访问的场景。
19.1.4.2. 常用函数
  • emplace_back() 将就地构造的元素添加到末尾。
  • emplace_front() 将就地构造的元素添加到开头。
  • push_back() 将元素添加到末尾。
  • push_front() 将元素添加到开头。
  • pop_back() 删除末尾元素。
  • pop_front() 删除开头元素。
  • remove() 删除指定值。
  • reverse() 反转元素。
  • sort() 按升序排序,sort( greater<>() ) 按降序排序。
  • swap() 交换容器元素。
  • rbegin() 返回反向第一个元素的迭代器。
  • rend() 返回反向超过末尾迭代器。

19.2. 关联容器

通过key访问元素。

19.2.1. map

19.2.1.1. 底层实现和特点
  • 底层实现为红黑树,有序。
  • 应用场景:适用于需要通过key快速查找value的场景。
19.2.1.2. 常用函数
  • contains() (C++20)是否包含指定键的元素。
  • count() 是否包含指定键的元素。
  • emplace() 就地插入构造的元素,即不执行复制或移动操作。
  • find() 返回指定键的迭代器。
  • erase(key),erase(iter_position) 移除指定键或指定位置的元素。
  • lower_bound() 返回键值等于或大于指定键的第一个元素的迭代器。
  • upper_bound() 返回键值大于指定键的第一个元素的迭代器。
19.2.1.3. map vs unordered_map
  • 底层实现为哈希表,无序。
  • 应用场景:适用于需要通过key快速查找value的场景,但不关心key的顺序。
  • unordered_map 直接访问元素的速度更快,尤其在大规模时,因为它通过直接计算key的哈希值来访问元素,时间复杂度o(1)。
  • 但unordered_map 内存占用更高,因为底层的哈希表需要预分配足够的空间。

19.2.2. set

19.2.2.1. 底层实现和特点
  • 底层实现为红黑树,有序。
  • 元素自身就是key。
  • 元素有唯一性,不允许出现重复的元素,且元素不可更改,但可以插入或删除。
  • 应用场景:适用于需要快速查找和去重的场景。
19.2.2.2. 常用函数
  • contains() (C++20)是否包含指定键的元素。
  • count() 是否包含指定键的元素。
  • emplace() 就地插入构造的元素,即不执行复制或移动操作。
  • find() 返回指定键的迭代器。
  • erase(key),erase(iter_position) 移除指定键或指定位置的元素。
  • lower_bound() 返回键值等于或大于指定键的第一个元素的迭代器。
  • upper_bound() 返回键值大于指定键的第一个元素的迭代器。
19.2.2.3. set vs unordered_set
  • 底层实现为哈希表,无序。
  • 应用场景:适用于需要快速查找和去重的场景,但不关心元素的顺序。
  • unordered_set 直接访问元素的速度更快,尤其在大规模时,因为它通过直接计算key的哈希值来访问元素,时间复杂度o(1)。
  • 但unordered_set 内存占用更高,因为底层的哈希表需要预分配足够的空间。

19.2.3 自定义比较函数对象,来定义元素的比较方式。

#include<iostream>
#include<set>
using namespace std;// 自定义比较函数对象,按照 pair 的第二个值进行比较
struct CompareBySecond {bool operator()(const pair<int, int>& p1, const pair<int, int>& p2) const {return p1.second < p2.second;}
};int main() 
{set<pair<int, int>, CompareBySecond> s = { {1,20},{2,10},{3,30},{4,5} };for (auto&& u : s)cout << u.first << " " << u.second << endl;return 0;
}

19.3. 容器适配器

本身只是一个封装层,必须依赖指定的底层容器,才能实现具体功能。即它是序列容器或关联容器的变体。

19.3.1 queue

19.3.1.1. 底层实现和特点
  • 底层容器默认deque。
  • 队列,先进先出。
  • 应用场景:适用于需要先进先出操作的场景,如广度优先搜索、任务调度、数据缓冲区等。
19.3.1.2. 常用函数
  • front() 返回第一个元素的引用。
  • back() 返回最后一个元素的引用。
  • empty() 返回是否空。
  • pop() 头部移除元素。
  • push() 尾部添加元素。
  • size() 返回元素数量。

19.3.2 priority_queue

19.3.2.1. 底层实现和特点
  • 底层容器默认vector。
  • 优先队列,元素按照优先级排序,每次弹出最高优先级的元素,即默认最大堆。
  • 最小堆使用 greater<> 作比较器。
  • 应用场景:适用于需要按照优先级处理元素的场景,如任务调度、最大(小)堆实现等。
19.3.2.2. 常用函数
  • top() 返回顶部元素的常量引用,即返回值不是左值。
  • empty() 返回是否空。
  • pop() 顶部移除元素,即弹出最大元素。
  • push() 添加元素。
  • size() 返回元素数量。

19.3.3 stack

19.3.3.1. 底层实现和特点
  • 底层容器默认deque。
  • 栈,后进先出。
  • 不允许遍历,只能访问顶部元素。
  • 应用场景:适用于需要后进先出操作的场景,如深度优先搜索、表达式求值、括号配对等。
19.3.3.2. 常用函数
  • top() 返回顶部元素的引用。
  • empty() 返回是否空。
  • pop() 顶部移除元素。
  • push() 顶部添加元素。
  • size() 返回元素数量。

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

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

相关文章

性能远超GPT-4!谷歌发布Med-Gemini医疗模型;李飞飞首次创业瞄准空间智能;疫苗巨头联合OpenAl助力AI医疗...

AI for Science 企业动态速览—— * 谷歌 Med-Gemini 医疗 AI 模型性能远超 GPT-4 * 斯坦福李飞飞首次创业瞄准「空间智能」 * 疫苗巨头 Moderna 与 OpenAl 达成合作 * 美国能源部推动 AI 在清洁能源领域的应用 * 美年健康荣获「2024福布斯中国人工智能创新场景应用企业TOP10」…

2024-5-9

今日流水账&#xff1a; 上午&#xff1a;又睡懒觉了&#xff0c;9点半才起来… 还是在调之前的那个 kernel pwn&#xff0c;但是 CONFIG_SLAB_FREELIST_HARDENED 加固泄漏 cookie 哪里我还是没搞明白&#xff08;&#xff1a;服了然后去理发、冲水卡了&#xff08;&#xff1a…

Centos 7.9如何使用源码编译安装curl最新版本

文章目录 1、前言2、curl源代码下载3、openssl安装4、编译curl4.1、配置编译环境4.2、编译输出二进制curl程序4.3、安装编译后的curl4.4、编译完成检查4.5、验证安装 1、前言 Centos 7.9&#xff0c;由于系统为2017年发行&#xff0c;且以稳定性为主&#xff0c;部分工具版本较…

吴恩达机器学习笔记:第 9 周-17大规模机器学习(Large Scale Machine Learning)17.3-17.4

目录 第 9 周 17、 大规模机器学习(Large Scale Machine Learning)17.3 小批量梯度下降17.4 随机梯度下降收敛 第 9 周 17、 大规模机器学习(Large Scale Machine Learning) 17.3 小批量梯度下降 小批量梯度下降算法是介于批量梯度下降算法和随机梯度下降算法之间的算法&…

Docker Desktop 修改容器的自启动设置

Docker Desktop 允许用户控制容器的自启动行为。如果你不希望某个容器在 Docker 启动时自动启动&#xff0c;你可以通过以下步骤来更改设置&#xff1a; 1. 打开 Docker Desktop 应用。 2. 点击右上角的设置&#xff08;Settings&#xff09;按钮&#xff0c;或者使用快捷键 Cm…

2024数维杯数学建模A题B题C题思路+模型+代码(开赛后第一时间更新)

2024数维杯数学建模A题B题C题思路模型代码&#xff08;开赛后第一时间更新&#xff09; https://mbd.pub/o/bread/ZpWakpdq https://mbd.pub/o/bread/ZpWakpdq 2024年第九届数维杯大学生数学建模挑战赛参赛规则 竞赛要求及论文提交方式; ①本次参赛作品统一在线提交到竞赛…

如何进行资产梳理(信息收集)

前言 渗透测试流程 线路一:渗透测试人员 1.域名收集--(备案收集) 1.1在线收集子域名 1.1.1 站长之家 1.1.2 IP138网站 1.1.3 查子域 1.1.4 RapidDNS 1.1.5 聚名 1.1.6 Crt.sh 1.1.7 googleHack 1.2工具和资产测绘收集子域名 1.2.1 oneforall(最好用,最全面) 1.2.…

内网安全-隧道技术SSHDNSICMPSMB上线通讯LinuxMac 简单总结

第126天&#xff1a;内网安全-隧道技术&SSH&DNS&ICMP&SMB&上线通讯Linux&Mac_内网安全-隧道技术_ssh_dns_icmp_smb_上线通讯linux_mac-CSDN博客 内网渗透—隧道技术_隧道技术csdn-CSDN博客 #SMB 隧道&通讯&上线 判断&#xff1a;445 通讯 上…

Spark云计算平台Databricks使用,创建workspace和Compute计算集群(Spark集群)

Databricks&#xff0c;是属于 Spark 的商业化公司&#xff0c;由美国加州大学伯克利 AMP 实验室的 Spark 大数据处理系统多位创始人联合创立。Databricks 致力于提供基于 Spark 的云服务&#xff0c;可用于数据集成&#xff0c;数据管道等任务。 1 创建workspace 点击创建wor…

YOLOv9改进策略 :一种新颖的通用倒瓶颈(UIB)搜索块助力检测| 轻量化之王MobileNetV4

💡💡💡创新点:轻量化之王MobileNetV4 开源 | Top-1 精度 87%,手机推理速度 3.8ms,原地起飞! 最主要创新:引入了通用倒瓶颈(UIB)搜索块,这是一个统一且灵活的结构,它融合了倒瓶颈(IB)、ConvNext、前馈网络(FFN)以及一种新颖的额外深度可分(ExtraDW)变体技…

【JavaWeb】网上蛋糕商城后台-客户管理

概念 上文中已讲解和实现了后台管理系统中的订单管理功能&#xff0c;本文讲解客户信息管理功能。 客户信息列表 在后台管理系统的head.jsp头部页面中点击“客户管理”向服务器发送请求 在servlet包中创建AdminUserListServlet类接收浏览器的请求 package servlet;import m…

totoriseSVN 常见问题

1. SVN 无法 clean up 上传时没有关闭 Excel&#xff0c;导致传入了一些临时文件&#xff08;文件名以$开头&#xff09;&#xff0c;关闭文件后临时文件自动删除&#xff0c;导致 SVN 版本错乱&#xff0c;使用 CleanUp 功能无效 更新时提示【Previous operation has not fin…

【Java探索之旅】super 子类构造 掌握

文章目录 &#x1f4d1;前言一、继承1.1 super1.2 子类的构造方法1.3 super与this的区别 &#x1f324;️全篇总结 &#x1f4d1;前言 继承作为面向对象编程中的重要概念&#xff0c;为我们提供了一种强大的代码复用和扩展机制。在Java中&#xff0c;通过继承可以实现子类对父类…

大数据毕业设计Python+Django地铁客流量预测 时间序列 深度学习 机器学习 人工智能 Python爬虫 计算机毕业设计

​ 博主介绍&#xff1a;全网粉丝100W,前互联网大厂软件研发、集结硕博英豪成立工作室。专注于计算机相关专业毕业设计项目实战6年之久&#xff0c;选择我们就是选择放心、选择安心毕业感兴趣的可以先收藏起来&#xff0c;点赞、关注不迷路 西安工程大学本科毕业设计&#xff…

C++中的std::bind深入剖析

目录 1.概要 2.原理 3.源码分析 3.1._Binder分析 3.2._CALL_BINDER的实现 4.总结 1.概要 std::bind是C11 中的一个函数模板&#xff0c;用于创建一个可调用对象&#xff08;函数对象或者函数指针&#xff09;的绑定副本&#xff0c;其中一部分参数被固定为指定值&#xf…

Visual Studio编译QT工程

1、安装QT 2、安装VS 3、选择扩展和更新 4、搜索Qt Visual Studio Tools&#xff0c;安装或卸载 5、安装成功后工具栏显示Qt VS Tools 6、配置Qt VS Tools&#xff1a;打开Qt VS Tools的下拉菜单&#xff0c;选择Qt Versions 7、选择qt qmake.exe 的路径

汽车行业芯片 车规级芯片 单车芯片( soc mcu)数量

链接&#xff1a;https://xueqiu.com/3000217281/272114755 10大车规级MCU芯片10大车规级MCU芯片 汽车芯片是什么&#xff1f; 汽车芯片即车规级芯片&#xff0c;标准要高于工业级和民用级芯片&#xff0c;仅次于军工级芯片。芯片大概有以下四种级别&#xff0c;分别是军工级…

猿匹配,一款使用环信实现的一个开源聊天应用含服务器

前言 之前写了一篇Android开发集成聊天环信SDK3.x简单开始&#xff0c;然后最近得空开发了一款使用环信实现的实时聊天应用&#xff0c;包含简单的服务器端&#xff0c;并开源给大家&#xff0c;有兴趣的同学可以一起搞一下&#xff0c;详细介绍看下边吧 上代码 服务器&#…

Java基于Spring Boot框架的校园外卖服务系统设计与实现(附源码,说明文档)

博主介绍&#xff1a;✌IT徐师兄、7年大厂程序员经历。全网粉丝15W、csdn博客专家、掘金/华为云//InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&#x1f3…

第二篇【AI与传奇开心果系列】Python的AI技术点库案例示例:详解AI工业应用算法原理

AI与传奇开心果系列博文 系列博文目录Python的AI技术点库案例示例系列 博文目录前言一、AI工业应用算法原理介绍二、机器学习在工业领域的应用算法示例代码三、深度学习算法在工业领域应用示例代码四、强化学习在工业领域应用示例代码五、自然语言处理在工业领域应用示例代码六…