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

news2024/11/24 9:19:16

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是可以重复的。

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

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

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

相关文章

分享一个Vue输入框获取焦点自动选中指令

需求背景&#xff1a;最近项目中遇到很多输入类控件&#xff0c;且有频繁改动需求&#xff0c;如果数值过长&#xff0c;则需要一直按着删除键&#xff0c;于是想能不能获取焦点的时候&#xff0c;就直接选中&#xff0c;这样就可以直接删除了 1、思路分析 记得很早的时候做小…

顺序表的实现

思维导图&#xff1a; 一&#xff0c;顺序表 一&#xff0c;顺序表的创建&#xff08;位置&#xff1a;头文件内&#xff09; 1.1顺序表的结构体类型 要求&#xff1a;创建顺序表并使这个顺序表能够存放数据&#xff0c;能记录有效数据的个数&#xff0c;能够记录容量大小。…

记 ==> 首次使用rabbitMQ优化项目

昨天刚学习完了rabbitMQ&#xff0c;刚好我的项目有个模块挺符合使用rabbitMQ进行异步处理的。 这个模块大概功能是&#xff1a;用户发送的所有帖子都会添加到他的发件箱&#xff0c;当有个新用户关注了他&#xff0c;他发件箱内所有的博客都会被添加到关注他的用户的收件箱里…

binkw32dll缺失怎么办?如何解决binkw32dll修复问题

binkw32dll缺失怎么办&#xff1f;在使用某些计算机游戏或应用程序时&#xff0c;您可能遇到过binkw32dll缺失的问题。这意味着您的计算机无法找到该DLL文件&#xff0c;从而无法正常运行程序。在本文中&#xff0c;我们将探讨binkw32.dll缺失的可能原因并提供解决方案。 一.什…

python flask 接口平台开发

文章目录descFlaskFlask-SQLAlchemyflasggerdesc 考虑到开发的便捷性、生态的丰富程度&#xff0c;用Flask、Flask-SQLAlchemy、flasgger等编写一套简单易用的接口平台 这里记录以下这几个组件的使用方式 Flask 轻量、灵活&#xff0c;相比Django不用遵循太多的开发规范 F…

SSM整合的基本思路梳理

SSM整合的简单思路流程 基本思路 我在整合的时候一般习惯从MyBatis开始向上构建&#xff0c;也就是在开始一个项目的时候先将DAO层搭建起来&#xff0c;再向上整合Spring以及SpringMVC。按照这个流程&#xff0c;可以做出一个比较简单的大致流程作为参考&#xff0c;帮助我们…

企业为什么要做网站?这篇文章告诉你

在如今数字化的时代&#xff0c;企业为什么要做网站&#xff1f;这个问题一直都是企业主和市场营销人员必须要考虑的问题。本文将以一个真实的案例为例&#xff0c;解析为什么企业要做网站以及如何通过网站提升业务和品牌的影响力。 案例背景 以一家小型私人医疗诊所为例&…

【神经网络】tensorflow实验4--Matplotlib数据可视化

1. 实验目的 ①掌握Matplotlib绘图基础 ②运用Matplotlib&#xff0c;实现数据集的可视化 ③运用Pandas访问数据集 2. 实验内容 ①绘制散点图、直方图和折线图&#xff0c;对数据进行可视化 ②下载波士顿数房价据集&#xff0c;并绘制数据集中各个属性与房价之间的散点图&#…

人人可用的敏捷指标工具!Kyligence Zen 正式发布 GA 版

4 月 11 日&#xff0c;Kyligence 指标平台产品发布会成功召开。发布会上&#xff0c;一站式指标平台 Kyligence Zen 正式推出 GA 版&#xff0c;接下来这款人人可用的敏捷指标工具将以更加完善、成熟、稳定的产品性能与功能解决企业面临的指标管理、分析和应用痛点 &#xff0…

【信息论】一、信息与信息论

“The fundamental problem of communication is that of reproducing at one point either exactly or approximately a message selected at another point.” —— Claude Elwood Shannon 1.1 信息的定义 什么是信息&#xff1f;它与消息、信号之间有什么区别和联系&#…

指纹识别q

1、指纹传感器 FTIR(Frustrated Total Internal Reflection)&#xff0c;受抑全内反射。在屏幕的夹层中加入LED光线&#xff0c;当用户按下屏幕时&#xff0c;使夹层的光线造成不同的反射效果&#xff0c;感应器接收光线变化而捕捉用户的施力点。 明显的缺点&#xff1a;体积太…

弹塑性力学--应变硬化

在单轴拉伸试验中&#xff0c;当应力超过屈服强度后&#xff0c;需要施加更大的载荷产生更大的应力&#xff0c;才会使材料发生更多的塑性变形。随着塑性应变的增加&#xff0c;材料变得更强、更难以变形了&#xff0c;因此这个阶段称为“应变硬化”&#xff08;Strain Hardeni…

数据库----------唯一约束、默认约束、零填充约束

目录 1.唯一约束&#xff08;Unique&#xff09; 1.概念 2.语法 3.添加唯一约束 4.删除唯一约束 2.默认约束(default) 1.概念 2.语法 3.添加默认约束 4.删除默认约束 3.零填充约束&#xff08;zerofill&#xff09;了解即可 1.概念 2.操作 3.删除 1.唯一约束&…

如来十三掌(与佛论禅、Rot13编码)

下载附件打开是一串... 佛经 666 这个编码方式还真是第一次遇见----与佛论禅 对文本进行与佛论禅密码解密 得到 MzkuM3gvMUAwnzuvn3cgozMlMTuvqzAenJchMUAeqzWenzEmLJW9 根据题目提示&#xff0c;如来十三掌&#xff0c;猜测是rot13加密&#xff0c;进行rot13解码 得到 Z…

Cloud computing

Cloud computing 可以看到右侧的容器虚拟化架构中&#xff0c;不需要运行额外的OS&#xff0c;这样启动的服务性能会相比于通过虚拟化软件实现的架构更优秀。但是虚拟机同样也有它的优点&#xff0c;比如它的安全、隔离性&#xff0c;可以运行不同的操作系统等等。 Virtualiz…

EasyCVR平台基于GB28181协议的语音对讲配置操作教程

EasyCVR基于云边端协同&#xff0c;具有强大的数据接入、处理及分发能力&#xff0c;平台可支持海量视频的轻量化接入与汇聚管理&#xff0c;可提供视频监控直播、视频轮播、视频录像、云存储、回放与检索、智能告警、服务器集群、语音对讲、云台控制、电子地图、平台级联等功能…

企业网站架构LAMP部署与优化(apache、mysql、php)

目录LAMP概述与简介编译安装Apache http服务1、关闭防火墙&#xff0c;将安装Apache所需软件包传到/opt/apache目录下2、在opt/apache目录下安装http所需软件包3、解压以下文件4、将解压的两个文件移到相应目录5、安装环境依赖包6、配置软件模块7、编译安装8、优化配置文件路径…

【linux】:linux下文件的使用以及文件描述符

文章目录 前言一、linux系统中的文件操作以及文件接口二、文件描述符 1.文件描述符的分配规则2.重定向总结前言 理解文件原理和操作&#xff1a; 我们先快速回忆下一C语言的文件操作&#xff1a; 首先看一下fopen函数的使用&#xff0c;然后我们写一段简单的C语言打开文件的代…

使用conda来管理虚拟环境

百度miniconda 下载windows版&#xff0c;安装的时候添加环境变量Conda -info -e 可以看到只有一个虚拟环境​ ​​​​​​3.Conda命令 &#xff08;1&#x…

高效学习方法分享和学习工具推荐

方法不对&#xff0c;努力白费&#xff1b;方法对了&#xff0c;事半功倍&#xff01; 口号喊起来&#xff0c;气氛拉满&#xff01; 我现在是吉林大学计算机科学与技术大四在读&#xff08;2023春季学期&#xff09;&#xff0c;刚好趁这个活动回顾一下我的大学生活。上过大学…