当前位置: 首页 > news >正文

STL源码剖析-六大部件, 部件的关系,复杂度, 区间表示

C++标准库-体系结构与内核分析

根据源代码来分析

介绍

自学C++侯捷老师的STL源码剖析的个人笔记,方便以后进行学习,查询。
为什么要学STL?按侯捷老师的话来说就是:使用一个东西,却不明白它的道理,不高明!

在这里插入图片描述

Level 0 使用C++标准库

标准库和STL是同样的东西吗?

不是,在标准库当中百分之80左右是STL,STL分为六大部件。
一些新旧标准:

  • C++标准库没有.h的后缀了,例如#include <vector>
  • 新式的头文件不带.h,例如#include <cstdio>,但是原来的带有.h的依然可以使用
  • 命名空间,把什么函数,模板之类的可以封装起来,新式的头文件以及组件都被封装到std当中

STL六大部件

  • 容器
  • 分配器
  • 算法
  • 迭代器
  • 适配器
  • 分配器
  1. 容器:容器要放东西,东西要占用内存,所以容器他非常好的是可以帮我们把内存的问题给解决掉,你看不到内存这个东西,只需要不断从容器当中放入/取出东西就好了,所以容器的背后需要另外一个部件去支持它,这个部件就是分配器,数据在容器里面。
  2. 分配器:是用来支持容器的。
  3. 算法:有一些函数/操作是由容器做的,但是更多的是包含在算法当中,操作数据的操作在算法里面。
  4. 迭代器:如何用算法去操作数据呢?使用迭代器,也就是泛化指针。
  5. 仿函数:作用像是一种函数。
  6. 适配器:把容器/算法/迭代器做一些转换。

在这里插入图片描述

六大部件之间的关系

在这里插入图片描述
vector<int, allocator<int>>,第二个参数是allocator。
以上为六大部件之间具体的联系与配合。在上方的程序当中,less<int>()这是标准库当中的一个仿函数,然后他的作用是进行比较,比如说a < b,然后现在利用了count_if这个算法,其作用是找到我们指定目标的数值,现在假如需要找到小于40的值,但是仿函数少了第二参数,所以就可以利用之前适配器的功能,适配器就是把容器/算法/迭代器做出一些转换,使用bind2nd这个转换,即可有了第二参数40;之后又进行函数的转换,加了一个not1,以前要找小于等于40,现在要大于40。

#include<vector>
#include<algorithm>
#include<functional>
#include<iostream>using namespace std;int main(void) {int ia[ 6 ] = { 27, 210, 12, 47, 109, 83};vector<int, allocator<int>> vi(ia, ia+6);cout<< count_if(vi.begin(), vi.end(), not1(bind2nd(less<int>(), 40)));return 0;
}

结果:

4...Program finished with exit code 0
Press ENTER to exit console.

疑惑

  • 仿函数:less()这是标准库当中的一个仿函数,然后他的作用是进行比较,比如说a < b
  • 适配器
    在这里插入图片描述

复杂度

在这里插入图片描述

前闭后开的区间

把元素放到容器当中,容器当然是有头有尾的,所有容器都提供begin(),end()迭代器,头没有疑虑,尾巴呢?所谓容器的前闭后开区间,标准库规定,begin()要表示开始的启动,end()表示最后一个元素的下一个元素。
在这里插入图片描述
###容器的遍历(C++11之前的写法):

Container<T> c;
...
Container<T>::iterator ite = c.begin();
for (; ite != c.end(); ++ite)...

最新的写法(最推荐C++11)基于范围的for循环

for (auto decl : coll)
{statement;
}

decl是一个声明,coll是一个容器,相比以前的写法,方便太多了。

不是非必要的时候不用auto,因为知道一个元素的类型还是很重要的。

在这里插入图片描述

容器的结构

在这里插入图片描述

容器的分类

1.序列式容器

在这里插入图片描述

序列式容器特点额外学习材料
array一段连续空间,不论是否使用,都会全部占用array
vector尾部可进可出,当空间不够时会自动扩充vector
deque双向都可扩充,两端都可进可出deque
list一个双向环状链表,有向前后和向后两个指针list
forward_list一个单向链表,仅有向后一个指针forward_list

关联型容器

联式容器类似于key-value,非常适合于查找操作

在这里插入图片描述

关联式容器名特点实现注释额外学习材料
set/multisetkey和value是同一个,BST存储是有序的红黑树加上multi意味着可以重复键值对set,multiset
map/multimap每一个key对应一个value,BST存储是有序的红黑树加上multi意味着可以重复键值对map,multimap
unordered_set/unordered_multiset相对于set/multiset,存储是无序的哈希表加上multi意味着可以重复键值对unordered_set,unordered_multiset
unordered_map/unordered_multimap相对于map/multimap,存储是无序的哈希表加上multi意味着可以重复键值对unordered_map,unordered_multimap

在这里插入图片描述
在标准库当中,并没有规定set和map用什么来实现,但是用红黑树(因为左右两边会自己平衡)非常好,所以各家IDE都用红黑树来做set和map。

map,每一个节点,都有key和value,set却没有明确划分。

选择普通的set和map,里面的元素的key是不能重复的,但是使用multiset以及multimap的时候,里面的key是可以重复的。

哈希表的某一条链表不能太长,因为单链表是要不断进行遍历的,这样时间复杂度就会很高。

相关文章:

STL源码剖析-六大部件, 部件的关系,复杂度, 区间表示

C标准库-体系结构与内核分析 根据源代码来分析 介绍 自学C侯捷老师的STL源码剖析的个人笔记&#xff0c;方便以后进行学习&#xff0c;查询。 为什么要学STL&#xff1f;按侯捷老师的话来说就是&#xff1a;使用一个东西&#xff0c;却不明白它的道理&#xff0c;不高明&…...

总有一个可用的连接,metaIPC1.2进入智能连接新时代

概述 metaIPC有1.0和2.0两个产品系列&#xff0c;2.0版本是可视对讲IPC&#xff0c;1.0新版本1.2在全面兼容ICE规范基础上进行了扩展&#xff0c;使metaIPC1.2进入智能化连接新时代。 metaIPC1.2在host/stun/turn/srs/zlm/janus/freeswitch等p2p/sfu/mcu进行全方位连通测试&a…...

棋盘问题c

在一个给定形状的棋盘&#xff08;形状可能是不规则的&#xff09;上面摆放棋子&#xff0c;棋子没有区别。要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列&#xff0c;请编程求解对于给定形状和大小的棋盘&#xff0c;摆放k个棋子的所有可行的摆放方案C。 Input …...

华纳云:Linux系统下怎么创建普通用户并更改用户组

本篇内容主要讲解“Linux系统下怎么创建普通用户并更改用户组”&#xff0c;感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷&#xff0c;实用性强。下面就让小编来带大家学习“Linux系统下怎么创建普通用户并更改用户组”吧! 要求 项目做权限管理&#xff0c;不用root部…...

「她时代」背后的欧拉力量

2018年大热电视剧《北京女子图鉴》&#xff0c;讲述了一群在北京打拼的职业女性&#xff0c;她们背井离乡&#xff0c;被现实包裹&#xff0c;被压力、责任困扰&#xff0c;但依旧用倔强的个性、不屈的进取心和深厚的知识技能努力营造、交织出一片励志的天空&#xff0c;既激昂…...

kubespray v2.21.0 在线部署 kubernetes v1.24.0 集群【2】

文章目录创建 虚拟机模板虚拟机名称配置静态地址配置代理yum 配置配置主机名安装 git安装 docker安装 ansible配置内核参数安装 k8s定制安装新增节点配置主机名配置代理配置互信更新 inventory报错kubespray v2.21.0 部署 kubernetes v1.24.0 集群 【1】在 Rocky linux 8.7 使用…...

聚焦运营商信创运维,美信时代监控易四大亮点值得一试!

2021年11月《“十四五”信息通信行业发展规划》提出&#xff0c;到2025年&#xff0c;我国将建立高速泛在、集成互联、智能绿色、安全可靠的新型数字基础设施体系。 此《规划》让我国运营商信创进一步加速&#xff0c;中国移动、中国电信、中国联通等都先后加入信创大军&#x…...

[python刷题模板] 博弈入门-记忆化搜索/dp/打表

[python刷题模板] 博弈入门-记忆化搜索/dp/打表 一、 算法&数据结构1. 描述2. 复杂度分析3. 常见应用4. 常用优化二、 模板代码1. 打表贪心的博弈2. 464. 我能赢吗3. Nim游戏--最最基础版n1。三、其他四、更多例题五、参考链接一、 算法&数据结构 1. 描述 博弈一直没…...

I2C通信

一、理论上了解I2C时序 I2C写数据时序如图&#xff1a; 通过解析器解析I2C通信如上图&#xff08;SCL和SDA反了&#xff09;。 1---起始信号 2、3---应答信号ACK 5---停止信号 起始信号&#xff1a;SCL线是高电平时&#xff0c;SDA线从高电平向低电平切换。 停…...

【Linux】man什么都搜不了,No manual entry for xxx的解决方案

本文首发于 慕雪的寒舍 man什么都搜不了&#xff0c;No manual entry for xxx的解决方案 系统 CentOS 7.6 1.问题描述 今天查手册的时候&#xff0c;发现man什么都查不了。不管是系统接口还是函数&#xff0c;都显示没有入口文档&#xff08;No manual entry for&#xff09;…...

STM32 库函数 GPIO_SetBits、GPIO_ResetBits、GPIO_WriteBit、GPIO_Write 区别

问题&#xff1a;当我使用STM32库函数对 I/O 口进行赋值时&#xff0c;在头文件中发现有四个相关的函数可以做这个操作&#xff0c;那么它们有什么区别呢&#xff1f; 一、GPIO_SetBits //eg: GPIO_SetBits(GPIOA, GPIO_Pin_1 | GPIO_Pin_2);解释&#xff1a;置位(置1)选择的数…...

在 RISC-V Linux 内核中添加模块

在 RISC-V Linux 内核中添加模块 flyfish 本例以添加helloworld字符设备为例 一 源码配置 1 源码 源码文件helloworld.c拷贝到 drivers/char 目录中 源码主要是输出Hello world init 2 Kconfig 打开drivers/char 目录下的Kconfig文件 在endmenu之前加上 config HELLO…...

利用AOP实现统一功能处理

目录 一、实现用户登录校验 实现自定义拦截器 将自定义的拦截器添加到框架的配置中&#xff0c;并且设置拦截的规则 二、实现统一异常处理 三、实现统一数据格式封装 一、实现用户登录校验 在之前的项目中&#xff0c;在需要验证用户登录的部分&#xff0c;每次都需要利…...

会话技巧---英文单词

目录 前言原文表示同意、答应表示不同意表示建议与忠告鼓励称赞担心与忧虑赞美夸奖-单词前言 加油 原文 表示同意、答应 1.agree[əˈgri]vi. 同意(=approve of); 答应(= consent to) agreement [əˈgrimənt] n. (意见或看法)一致 agree with sb about / on sth…...

VS中解决方案和项目的区别

总目录 文章目录总目录一、概述1、解决方案2、项目3、项目文件4、解决方案文件夹二、图解1、图解解决方案和项目的关系2、图解sln文件3、图解项目文件结语一、概述 1、解决方案 解决方案是一个容器&#xff0c;通常包含多个项目&#xff0c;这些项目通常相互引用。 解决方案中…...

MyBatis的parameterType传入参数类型和resultType返回结果类型

记录&#xff1a;413 场景&#xff1a;MyBatis的parameterType传入参数类型和resultType返回结果类型。 版本&#xff1a;JDK 1.8,Spring Boot 2.6.3,mybatis-3.5.9。 1.传入参数parameterType是Integer 传入参数类型parameterType&#xff1a;java.lang.Integer。 返回结…...

什么是Android FrameWork,请你介绍一下?

Framework是什么 Framework的中文意思是“框架”&#xff0c;在软件开发中通常指开发框架&#xff0c;在一个系统中处于内核层之上&#xff0c;为顶层应用提供接口&#xff0c;被设计用来帮助开发者快速开发顶层应用&#xff0c;而不必关心系统内核运行机制&#xff0c;通常Fr…...

【SQL 必知必会】- 第十六课 更新和删除数据

目录 更新数据 不要省略WHERE 子句 在UPDATE 语句中使用子查询 删除数据 不要省略WHERE 子句 友好的外键 删除表的内容而不是表 更快的删除 更新和删除的指导原则 这一课介绍如何利用UPDATE 和DELETE 语句进一步操作表数据。 更新数据 更新&#xff08;修改&#xff09;表中…...

常见哈希算法及其应用

哈希算法经常会被用到&#xff0c;比如我们Go里面的map&#xff0c;Java的HashMap&#xff0c;目前最流行的缓存Redis都大量用到了哈希算法。它们支持把很多类型的数据进行哈希计算&#xff0c;我们实际使用的时候并不用考虑哈希算法的实现。而其实不同的数据类型&#xff0c;所…...

PHP快速入门02-PHP语言基础

文章目录前言一、 数据类型1.1 String&#xff08;字符串&#xff09;1.2 Integer&#xff08;整型&#xff09;1.3 Float&#xff08;浮点型&#xff09;1.4 Boolean&#xff08;布尔型&#xff09;1.5 Array&#xff08;数组&#xff09;1.6 Object&#xff08;对象&#xff…...

终极指南:如何测试Binwalk自定义提取器:从单元测试到集成测试的完整方案

终极指南&#xff1a;如何测试Binwalk自定义提取器&#xff1a;从单元测试到集成测试的完整方案 【免费下载链接】binwalk Firmware Analysis Tool 项目地址: https://gitcode.com/gh_mirrors/bi/binwalk Binwalk 是一款强大的固件分析工具&#xff0c;专门用于识别和提…...

AWS CloudFormation Templates多区域部署:构建高可用架构终极指南

AWS CloudFormation Templates多区域部署&#xff1a;构建高可用架构终极指南 【免费下载链接】aws-cloudformation-templates awslabs/aws-cloudformation-templates: 是一个包含各种 AWS CloudFormation 模板的存储库。适合查找和学习 AWS CloudFormation 模板的示例&#xf…...

Curated Programming Resources实战案例:如何利用这些资源快速掌握新技能

Curated Programming Resources实战案例&#xff1a;如何利用这些资源快速掌握新技能 【免费下载链接】curated-programming-resources A curated list of resources for learning programming. 项目地址: https://gitcode.com/gh_mirrors/cu/curated-programming-resources …...

bilibili-parse极简工具:三步搞定B站视频解析的高效方案

bilibili-parse极简工具&#xff1a;三步搞定B站视频解析的高效方案 【免费下载链接】bilibili-parse bilibili Video API 项目地址: https://gitcode.com/gh_mirrors/bi/bilibili-parse 您是否曾因想保存B站精彩视频却被复杂的技术门槛劝退&#xff1f;是否在面对AV号/…...

告别乱码!手把手教你用阿里妈妈数黑体+LVGL 8.3打造炫酷中文界面(附图标字体生成全流程)

告别乱码&#xff01;手把手教你用阿里妈妈数黑体LVGL 8.3打造炫酷中文界面&#xff08;附图标字体生成全流程&#xff09; 在智能家居控制面板、工业HMI等嵌入式设备开发中&#xff0c;中文显示一直是工程师的痛点。传统解决方案要么占用过多Flash空间&#xff0c;要么显示效…...

别再只盯着通用数据集了!盘点2024年那些能直接拿来微调LLaMA、ChatGLM的医学问答数据集

2024医学大模型实战&#xff1a;精选可直接微调的问答数据集与应用指南 当开源大模型如LLaMA-3、ChatGLM3和Gemma在通用领域展现出惊人潜力后&#xff0c;医疗健康领域正成为下一个技术落地的黄金赛道。但许多工程师在兴奋地下载完模型权重后&#xff0c;却卡在了最关键的一环—…...

Spring Boot项目里Redis连接总报错?从配置到调试的完整避坑指南(附Redis 6+密码问题)

Spring Boot项目Redis连接报错全解析&#xff1a;从配置陷阱到高效调试 Redis作为Spring Boot项目中最常用的缓存组件&#xff0c;连接报错却是开发者最常遇到的"拦路虎"。明明按照文档配置了参数&#xff0c;却总是遇到Connection refused、NOAUTH Authentication r…...

Unity Tilemap瓦片动态缩放:保持网格尺寸不变的核心技巧

1. 为什么需要动态缩放Tilemap瓦片&#xff1f; 在开发2D游戏时&#xff0c;Tilemap是最常用的地图构建工具之一。比如制作一个棋盘游戏&#xff0c;每个格子大小固定为64x64像素&#xff0c;但随着关卡难度提升&#xff0c;我们希望棋子能动态缩小显示&#xff0c;而格子本身尺…...

从单颗粒到多相流:OpenFOAM+LIGGGHTS耦合参数调优心得与性能分析

从单颗粒到多相流&#xff1a;OpenFOAMLIGGGHTS耦合参数调优实战指南 在颗粒-流体耦合模拟领域&#xff0c;OpenFOAM与LIGGGHTS的组合已成为工业级仿真的黄金标准。但当我们从教学案例转向真实工程场景时&#xff0c;参数敏感性、计算效率与物理真实性之间的平衡往往成为困扰研…...

Wan2.2-I2V-A14B开发者实践:基于FastAPI封装私有视频生成服务

Wan2.2-I2V-A14B开发者实践&#xff1a;基于FastAPI封装私有视频生成服务 1. 镜像概述与核心优势 Wan2.2-I2V-A14B是一款专为文本到视频生成任务优化的私有部署镜像&#xff0c;特别针对RTX 4090D 24GB显存显卡进行了深度优化。这个镜像将帮助开发者快速搭建私有视频生成服务…...