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

news2024/11/16 6:00:19

文章目录

  • 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.coloradmin.cn/o/1656533.html

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

相关文章

CentOS常用命令有哪些?

目录 一、CentOS常用命令有哪些&#xff1f; 二、不熟悉命令怎么办&#xff1f; 场景一&#xff1a;如果是文件操作&#xff0c;可以使用FileZilla工具来完成 场景二&#xff1a;安装CentOS桌面 一、CentOS常用命令有哪些&#xff1f; CentOS 系统中有许多常用命令及其用法…

计算机SCI期刊,IF=9.657,1区TOP,2周内出版!

一、期刊名称 Neural Networks 二、期刊简介概况 期刊类型&#xff1a;SCI 学科领域&#xff1a;计算机科学 影响因子&#xff1a;7.8 中科院分区&#xff1a;1区TOP 出版方式&#xff1a;订阅模式/开放出版 版面费&#xff1a;选择开放出版需支付$3350 三、期刊简介 神…

Android Compose 一:基础控件

Flutter 与 Compose 组件辣么像&#xff0c;难道是同一个google团队整的&#xff1b;也未深究&#xff0c;只是猜测。 创建项目 需要使用新版本Android studio&#xff0c;忽略步骤… 项目目录 MainActivity说明 1 系统默认页面 Preview 修饰的方法&#xff0c;只用来供开发…

怎么制作地理思维导图?方法推荐

怎么制作地理思维导图&#xff1f;随着信息技术的飞速发展&#xff0c;教育领域也迎来了深刻的变革。思维导图作为一种高效的学习工具&#xff0c;已经广泛应用于地理学科的教学中。它不仅可以帮助学生更好地理解和记忆地理知识&#xff0c;还能提高学习效率。本文将为大家推荐…

深度解析:数据结构二叉树(1)

✅作者简介&#xff1a;大家好&#xff0c;我是再无B&#xff5e;U&#xff5e;G&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a; 再无B&#xff5e;U&#xff5e;G-CSDN博客 目标 1. 掌握树的基本概念 2. 掌握二叉…

【多客开源】游戏陪玩系统,游戏陪玩源码,游戏陪玩语音社交源码运营版游戏陪玩平台源码/tt语音聊天/声优服务/陪玩系统源码开黑/约玩源码

介绍 我们针对陪玩app源码市场的发展趋势&#xff0c;整合市面上主流陪玩app应用功能&#xff0c;自主开发了多客陪玩系统源码&#xff0c;并可为客户提供全部原生陪玩源码&#xff0c;进行二次开发&#xff0c;打造适用于线上游戏陪玩、语音聊天、心理咨询、情感陪伴等业务场…

20240509打开VMware17出现问题:VMware Workstation 未能启动 VMware Authorization Service

20240509打开VMware17出现问题&#xff1a;VMware Workstation 未能启动 VMware Authorization Service 2024/5/9 16:37 VMware Workstation 未能启动 VMware Authorization Service。您可以尝试手动启动 VMware Authorization Service。如果此问题仍然存在&#xff0c;请联系 …

照片格式怎么转换jpg?利用在线图片处理工具完成操作

图片有许多不同的格式类型&#xff0c;其中我们最常见的是jpg和png等。通常在平台上上传图片时&#xff0c;大多数要求使用jpg格式较多&#xff0c;但你知道吗&#xff1f;不同的设备和软件可能有不同的默认保存格式。如果你发现你的照片不是jpg格式&#xff0c;该如何转换呢&a…

苹果手机热点怎么开?3步快速连接

在如今的数字时代&#xff0c;苹果手机已经成为了人们生活中不可或缺的一部分。在某些情况下&#xff0c;我们可能需要与他人分享我们的网络连接&#xff0c;这时候就可以使用苹果手机的热点功能。 苹果手机提供了非常简单的方法来开启热点&#xff0c;只需要三个简单的步骤即…

Satellite Communications Symposium(WCSP2022)

1.Power Allocation for NOMA-Assisted Integrated Satellite-Aerial-Terrestrial Networks with Practical Constraints(具有实际约束的 NOMA 辅助天地一体化网络的功率分配) 摘要&#xff1a;天地一体化网络和非正交多址接入被认为是下一代网络的关键组成部分&#xff0c;为…

通过MediaPipe+MiDaS实现人脸单目测距

MediaPipe&#xff1a;是Google开发的适用于直播和流媒体的开源、跨平台、可定制的机器学习解决方案。code地址&#xff1a;https://github.com/google/mediapipe &#xff0c;最新发布版本v0.10.11&#xff0c;license为Apache-2.0。MediaPipe Solutions提供了一套库和工具&am…

rk3588局域网推流

最近无意间看见在网上有使用MediaMtx插件配合ffmpeg在Windows来进行推流&#xff0c;然后在使用其他软件进行拉流显示数据图像的&#xff0c;既然windows都可以使用 &#xff0c;我想linux应该也可以&#xff0c;正好手上也有一块RK3588的开发板&#xff0c;就测试了一下&#…

班级综合测评|基于Springboot+vue的班级综合测评管理系统(源码+数据库+文档)

目录 基于Springbootvue的“智慧食堂”系统 一、前言 二、系统设计 三、系统功能设计 1 管理员功能模块 2学生功能模块 3教师功能模块 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取&#xff1a; 博主介绍&#xff1a;✌️大…

创建一个react项目(router,store,axios,antd)最后有项目地址

第一步&#xff1a;使用cra脚手架 创建项目 文档地址&#xff1a;Create React App 中文文档 npx create-react-app 你的项目名称 第二步&#xff1a;整理项目结构和删除多余代码 目标效果图&#xff1a; 在src目录下分别新建apis,assets,components,pages,router,store,ut…

英文文本标点恢复

文章目录 一、安装 rpunct二、使用三、下载模型时报错1、报错详情2、报错原因3、解决方案 四、程序运行时报错1、报错详情2、报错原因3、解决方案 五、修改默认缓存路径 一、安装 rpunct pip install rpunct 相关依赖包信息&#xff1a; langdetect1.0.9 pandas1.2.4 simpletr…

记录一下Hql遇到的零碎问题

建表相关 -- 地区维度表 drop table dim_province_full; create table dim_province_full( id string comment 编号, name string comment 省份名称, region_id string comment 大区id, area_code string comment 行政区位码, iso_code string comment 国际编码, iso_3166_2 s…

关于位操作符的实际应用<C语言>

前言 位操作符在C语言初学阶段相对其他操作符来说&#xff0c;是一种难度比较大的操作符&#xff0c;且运用较少的一类操作符&#xff0c;但是位操作符并不是“一无是处”&#xff0c;合理运用的位操作符&#xff0c;在某些场景下可以优化算法&#xff0c;提高代码的执行效率&a…

最新AI实景自动无人直播软件教你实现24小时不下播带货;智能化引领直播新时代

随着互联网的快速发展&#xff0c;直播行业已经成为商家品牌推广和商品销售的热门方式。而如今&#xff0c;一款令人惊叹的AI实景自动无人直播软件正在让直播变得更加智能化和便捷化&#xff0c;为商家带来全新的直播体验。 AI实景自动无人直播软件的一大优势是其智能讲解功能。…

远动通讯屏的作用

远动通讯屏的作用 远动通讯屏有时有称为调度数据网柜&#xff0c;远动通讯屏具体干啥作用&#xff1f;远动通讯屏是以计算机为基础的生产过程与调度自动化系统&#xff0c;可以对现场的运行设备进行监视和控制、以实现数据采集、设备测量、参数调节以及各类信号报警等各项功能。…

AI视频教程下载:学会用AI创作文本图片音频视频

在不断发展的科技领域&#xff0c;人工智能 (AI) 是毋庸置疑的冠军&#xff0c;它是一种不断创新的力量&#xff0c;在我们的生活中扮演着越来越重要的角色。随着 2023 年的到来&#xff0c;我们诚挚地欢迎您加入人工智能精通课程的大门。 这不仅仅是一个课程&#xff0c;它专为…