【C++】【自用】SLT 六大组件:容器

文章目录

  • 🔺🔺🔺
    • 1. map / set
      • 1.1 常见接口的使用
      • 1.2 经典问题
        • operator[] 的返回值是什么?
        • 底层实现原理是什么?
        • 一个类型要做 map 和 set 的 K 有什么要求?
        • map 和 set 有什么特点?
      • 1.3 multi 版本的特点
    • 2. unordered_map / unordered_set(C++11)
      • 2.1 常见接口的使用
      • 2.2 经典问题
        • 底层实现原理是什么?
        • 一个类型要做 unordered_map 和 unordered_set 的 K 有什么要求?
        • unordered_xxx 和 map/set 相比有什么特点?
    • 3. vector / list
      • 3.1 常见接口的使用
      • 3.2 常见问题
        • vector 和 list 的比较?
        • vector 扩容是怎么扩的?
  • 🔺🔺
    • 4. string 常见接口的使用
    • 5. stack / queue 常见接口的使用
    • 6. priority_queue 常见接口的使用
    • 7. bitset 常见接口的使用
  • 🔺
    • 8. array(C++11)
    • 9. forward_list(C++11)
    • 10. deque


容器分类:

  • 序列式容器:有顺序如 vector
  • 关联式容器:有关联如 map、set

🔺🔺🔺

1. map / set


1.1 常见接口的使用

  • insert
  • erase
  • find
  • map 的 operator[]
  • iterator

1.2 经典问题

operator[] 的返回值是什么?

value 的引用

底层实现原理是什么?
  • 红黑树:
    • 规则
    • 增删查改的效率
一个类型要做 map 和 set 的 K 有什么要求?
  • 支持比较大小,因为底层是搜索树
map 和 set 有什么特点?
  • 查找的效率为 O(logN)
  • 遍历是按照 key 排序的,且可以对 key 去重

1.3 multi 版本的特点

  • 允许键值冗余

2. unordered_map / unordered_set(C++11)

2.1 常见接口的使用

  • insert
  • erase
  • find
  • unordered_map 的 operator[]
  • iterator

2.2 经典问题

底层实现原理是什么?
  • 哈希表:
    • 规则
    • 增删查改的效率
一个类型要做 unordered_map 和 unordered_set 的 K 有什么要求?
  • 能取模或者配一个哈希的仿函数支持转化成整型取模
  • 支持 == 比较
unordered_xxx 和 map/set 相比有什么特点?
  • 更快,查找的效率平均为 O(1)
  • 遍历是无序的,也可以对 key 去重

3. vector / list


3.1 常见接口的使用

vector:

  • push_back / pop_back
  • []
  • reserve :只开空间,不能用 [],因为 [] 会检查未初始化数据
    resize :开空间 + 初始化,使用后,可以用 [] 访问进行修改
  • insert / erase
  • iterator

3.2 常见问题

vector 和 list 的比较?
  • vector 的优点:

    • 适合尾插尾删
    • 支持通过下标随机访问
    • 因为是连续的物理空间,cpu 高速缓存访问,命中率会更高
  • vector 的缺点:

    • 头部中间插入需要挪动数据,效率比较低
    • 扩容需要代价
  • list 的优点:

    • 任意位置 O(1) 的插入删除
    • 按需申请释放

-list 的缺点

  • 不支持随机访问
  • list 可能造成内存碎片的问题,不过 空间配置器 可以一定程度上解决
vector 扩容是怎么扩的?
  • 一般是 2 倍扩容,但是不是一定,和编译器有关(g++ 2倍,vs 1.5倍)
    • 至于为什么是 2 倍左右?合适呗,一次扩多了浪费,一次扩少了效率低
  • C++11 之前 使用的是 拷贝构造
  • C++11 之后 使用的是 移动构造

🔺🔺

4. string 常见接口的使用

  • +=
  • find
  • insert / erase
  • []
  • iterator
  • c_str
  • sub_str
  • reserve
  • resize
  • to_string
  • stoi

5. stack / queue 常见接口的使用

  • push / pop
  • top
  • front / back
  • empty / size

6. priority_queue 常见接口的使用

底层是 二叉树 的 堆

  • push / pop
  • top
  • empty / size

7. bitset 常见接口的使用

  • set
  • reset
  • test

🔺

8. array(C++11)

  • 核心价值:相比 C 的静态数组,[] 绝对检查越界

  • 委员会期望代替静态数组,但实际效果不明显

9. forward_list(C++11)

  • 使用场景:只头插头删,又想节省一点点空间

  • 相同场景下,比起 list 有一点点优势

10. deque

  • 使用场景:头尾插入删除多,可能还需要一些下标的随机访问
  • 要注意的是,不要大量的下标随机访问,否则效率不如 vector 好

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

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

相关文章

stm32mp157中断简单应用

设置按键中断,按键1按下,LED亮,再按一次,灭 按键2按下,蜂鸣器响。再按一次,不响 按键3按下,风扇转,再按一次,风扇停 main.c #include "gpio.h" #include &…

leetcode 打家劫舍篇

198. 打家劫舍 你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。 给定一个代表每个…

Transformer预测 | Pytorch实现基于Transformer的锂电池寿命预测(NASA数据集)

文章目录 效果一览文章概述模型描述程序设计参考资料效果一览 文章概述 Pytorch实现基于Transformer 的锂电池寿命预测,环境为pytorch 1.8.0,pandas 0.24.2 随着充放电次数的增加,锂电池的性能逐渐下降。电池的性能可以用容量来表示,故寿命预测 (RUL) 可以定义如下: SOH(t…

Vue2 修改了数组哪些方法,为什么

1、Vue2 修改了以下数组方法 push()、pop()、shift()、unshift()、splice()、sort()、reverse() 这些方法都是可以改变原数组的。 为了实现数据响应式更新,Vue2 在这些方法中添加了特定的代码,以便通知 Vue 视图更新数据 举个例子,当我们…

Linux Shell 实现一键部署vmtools

VMware Tools 简介 VMware Tools 中包含一系列服务和模块,可在 VMware 产品中实现多种功能,从而使用户能够更好地管理客户机操作系统,以及与客户机操作系统进行无缝交互。 VMware Tools 具备以下功能: 将消息从主机操作系统传递…

代码随想录第42天 | ● 309.最佳买卖股票时机含冷冻期 ● 714.买卖股票的最佳时机含手续费

309.最佳买卖股票时机含冷冻期 // 一维数组空间优化 const maxProfit (prices) > {const n prices.lengthconst dp new Array(4).fill(0)dp[0] -prices[0]for (let i 1; i < n; i ) {const temp dp[0] // 缓存上一次的状态const temp1 dp[2]dp[0] Math.max(dp[0…

TCP/IP(十五)拥塞控制

一 拥塞控制 ① 拥塞控制必要性 思考&#xff1a; 为什么要有拥塞控制呀,不是有流量控制了吗&#xff1f; ② 拥赛窗口 cwnd 什么是拥塞窗口? 和发送窗口有什么关系呢?明白&#xff1a; cwnd、swnd、rwnd 缩写 含义 ③ 如何知道当前网络是否出现了拥塞呢&#xff1f;…

搞定ESD(三):ESD干扰耦合路径深入分析(一)

文章目录 一、外部测试环境引发的电场耦合1.1 静电枪枪体的电场耦合1.2 垂直耦合板与水平耦合板的电场耦合二、静电电流泄放路径中的电场耦合2.1 金属平面与敏感信号之间的电场耦合2.2 参考平面与敏感信号布线之间的电场耦合2.3 芯片散热片电场耦合分析2.3.1 散热片静电耦合机理…

如何看待为了省小钱而花费时间

相信每个人都会遇到这种情况&#xff1a;购买东西时想着货比三家或者想办法领优惠券、凑单等就可以省下一些钱&#xff0c;但是需要花费不少时间和精力。这时就开始犹豫了&#xff1a;省钱是必要的&#xff0c;需要居安思危&#xff0c;等到缺钱的时候不会后悔&#xff1b;又想…

不定积分(原函数)存在性定理、定积分存在性定理、变限积分存在性定理

1.不定积分(原函数)存在性定理、定积分存在性定理、变限积分存在性定理 笔记来源&#xff1a; 1.10个命题搞懂可积和原函数存在 2.考研变限积分概念超详细&#xff0c;超通俗讲解&#xff08;变限积分和原函数关系&#xff09; 声明&#xff1a;本文截图主要来自bili心一学长、…

Edge使用猴油脚本实战(实验室安全考试系统刷在线时长——网站永久自动刷新)

介绍 篡改猴 (Tampermonkey) 是拥有 超过 1000 万用户 的最流行的浏览器扩展之一。它允许用户自定义并增强您最喜爱的网页的功能。用户脚本是小型 JavaScript 程序&#xff0c;可用于向网页添加新功能或修改现有功能。使用 篡改猴&#xff0c;您可以轻松在任何网站上创建、管理…

Android平台实现lottie动画

1、lottie动画简介 Lottie 是一个应用十分广泛动画库&#xff0c;适用于Android、iOS、Web、ReactNative、Windows的库&#xff0c;它解析了用Bodymovin导出为json的Adobe After Effects动画&#xff0c;并在移动和网络上进行了原生渲染。它提供了一套完整得从AE到各个终端的…

【Java 进阶篇】JavaScript二元运算符详解

JavaScript是一门多用途的编程语言&#xff0c;它支持各种运算符&#xff0c;包括二元运算符。二元运算符用于执行两个操作数之间的操作&#xff0c;这两个操作数通常是变量、值或表达式。在本篇博客中&#xff0c;我们将详细探讨JavaScript的二元运算符&#xff0c;包括它们的…

记录:R语言生成热图(非相关性)

今天解决了一个困扰了我很久的问题&#xff0c;就是如何绘制不添加相关性的热图。一般绘制热图是使用corrplot包画相关性图&#xff0c;但是这样有一个前提&#xff0c;就是输入的数据集必须进行相关性分析。那么如果我不需要进行相关性分析&#xff0c;而是直接绘制能够反应数…

【快刊推荐】CCF-C类,2/3区SCIE,仅29天录用,16天见刊!

计算机领域 • 好刊推荐 01 期刊简介 影响因子&#xff1a;3.0-4.0 检索数据库&#xff1a;SCIE 在检 期刊分区&#xff1a;JCR2/3区&#xff0c;中科院4区 02 影响因子 影响因子呈现逐年稳步上升的趋势 03 期刊分区&#xff1a;JCR2/3区&#xff0c;中科院4区 04 预警…

Haskell网络编程:从数据采集到图片分析

概述 爬虫技术在当今信息时代中发挥着关键作用&#xff0c;用于从互联网上获取数据并进行分析。本文将介绍如何使用Haskell进行网络编程&#xff0c;从数据采集到图片分析&#xff0c;为你提供一个清晰的指南。我们将探讨如何使用亿牛云爬虫代理来确保高效、可靠的数据获取&am…

C++安装qt软件教程

目录 一、工具 二、安装步骤 1.1next 1.2安装目录 1.3安装环境设置选项 1.4Qt5.14.2 --> MinGW 7.3.0 64-bit 1.5 Qt5.14.2 --> 3D以下全选 1.6下一步 1.7下一步 1.8安装 三、什么是 Qt Qt 是一个跨平台的 C图形用户界面应用程序框架。 它为应用程序开发者提…

Python 单元测试设置

单元测试检查特定代码单元或模块是否按照开发人员的预期执行。 大多数时候&#xff0c;我们测试的代码单元是一个函数。 同样&#xff0c;我们可以测试所有功能。 作为最佳实践&#xff0c;至少在开发过程中&#xff0c;我们应该进行单元测试。 因此&#xff0c;在开发过程的…

java并发之AQS详解(待更)

一、为什么要用AQS同步框架&#xff1f; 开发者如果不了解JMM和多线程编程&#xff0c;就会写出很多线程不安全的程序&#xff0c;即使是经验丰富的程序员&#xff0c;并发编程也难免会出错。 而对于java程序员来说&#xff0c;并发编程就变得容易得多了&#xff0c;因为并发编…

如何在雷电模拟器上安装Magisk并加载movecert模块抓https包(二)

接来下在PC端安装和配置Charles&#xff0c;方法同下面链接&#xff0c;不再赘述。在模拟器上安装magisk实现Charles抓https包&#xff08;二&#xff09;_小小爬虾的博客-CSDN博客 一、记录下本机IP和代理端口 二、在手机模拟器上设置代理192.168.31.71:8888&#xff0c;设置…