C++标准库分析总结(一)
之前学习过标准库,最近身边有人问到相关话题,故在此做一个总结
1 标准库介绍
C++标准库:C++ Standard Library
C++标准模板库:Standard Template Library(STL)
1.1 二者关系及表现形式
- 标准库是由编译器提供的(比如我们常见的VC,GCC...),STL属于标准库的一部分(占比绝大部分),标准库一定是包含(大于)STL的;
- 标准库引用形式:
- 都是以头文件的形式提供不带.h,比如:#include<vector>;
- 新式c头文件一般是:#include<cstdio>;
- 命令空间:namespace std;
引用方法:
#include <iostream>
#include <cstdio> //snprintf()
#include <cstdlib> //RAND_MAX
#include <cstring> //strlen(), memcpy()
#include <string>
using namespace std;
using std::cin;
using std::cout;
using std::string;
1.2 STL六大部件

以上的六大部件解释如下:
- 容器:容器就是我们存放数据的地方,相当于数据仓库,实现方式是类模板;
- 分配器:管理容器背后的内存使用,实现方式是类模板;
- 算法:常见的比如排序、查找等,实现方式是函数模板;
- 迭代器:算法操作容器的桥梁,是一种泛化的指针,实现方式是类模板;
- 仿函数:或者叫Function Object,它是一个类对象,其次它重载了
()操作符,使用在自定义类对象时,比如我们对石头进行排序,在算法操作时就可以写一些仿函数供算法正确使用,实现方式时类模板; - 适配器:相对于迭代器、仿函数、容器的数据转换,实现方式是类模板。
1.3 STL的简单使用

1.4 事间复杂度
要讨论时间复杂度,其中n必须建立在足够大的工业数据基础上

1.5 STL中的区间表示法
STL采用前闭后开区间表示数据的范围,所有的数据都是通过begin()和end()两个函数表示数据的范围,begin表示数据的头,end表示数据尾的下一个元素,也就是说,对end进行解引用操作得到的指针它是不确定的东西,也可能造成程序宕机或者其他不是你心里所想的东西。

2 容器分类
容器分为序列式容器和关联式容器(分为有序和无序),红色部分是c++2.0引入的

序列式容器(Sequence Container):元素都是有序的,里面的空间可能是连续的,也可能是由指针一个个串起来的;
关联式容器(Associative Container):元素是由key和value组成的,当然用key能很快找value,适用于查找操作
2.1 序列式容器(Sequence Container)
2.1.1 Array
对比于c语言的数组,标准库进行封装,初始化的时候就要确定大小,不能扩展(注意在栈上有大小限制,不同的机器内存限制不一样);
2.1.2 Vector
一种可以动态扩充的数组,只能在容器的末端进行扩充,当容量不足时会自动扩充,扩充规则为当前空间的2倍,内存由Vector背后的分配器进行,使用者不用关心内存分配问题;
2.1.3 Deque
双端队列,容器两端均可进行数据扩充;
2.1.4 List
双向环状链表,内存占用比Forward_List多;
2.1.5 Forward_List
单向链表,只能从尾部扩充。
2.2 关联式容器(Associative Container)-- 有序
元素key是有序
2.2.1 Set/MultSet
目前各大厂商编译器都是由红黑树(RBtree)实现,保证每个子树根节点键值大于左子树所有节点的键值,小于右子树所有节点的键值,左右是高度平衡的防止某一个分支比较长,每个元素由key和value组成,set中key和value是同一个值,key和value是不分的,元素不可重复,当重复放入时容器会反弹回来;
MultSet表示元素可以重复。
2.2.2 Map/Multimap
目前各大厂商编译器也都是由红黑树实现,区别于set,每个元素分为key和value,同样元素不可重复,当重复放入时容器会反弹回来;
Multimap表示元素可重复,也就是key-value可重复。
2.3 无序容器(Unordered Container)-- 无序
元素的key是无序的;
Unordered set和Unordered map底层是由哈希表(Hashtable)实现,用哈希表必然存在元素碰撞问题,所以各大编译器都采用Separate Chaining哈希表。
C++标准库分析总结(一)的更多相关文章
- C++标准库分析总结(三)——<迭代器设计原则>
本节主要总结迭代器的设计原则,以及iterstor traits的设计作用 1.迭代器遵循的原则 迭代器是算法和容器的桥梁,它是类模板的设计,迭代器必须有能力回答算法提出的问题才能去搭配该算法的使用 ...
- golang标准库分析之net/rpc
net/rpc是golang提供的一个实现rpc的标准库.
- C++标准库分析总结(八)——<仿函数、适配器、istream_iterator、ostream_iterator、bind>
一.仿函数定义 仿函数是STL中最简单的部分,存在的本质就是为STL算法部分服务的,一般不单独使用.仿函数(functors)又称为函数对象(function objects),虽然函数指针虽然也可以 ...
- C++标准库分析总结(五)——<Deque、Queue、Stack设计原则>
本节主要总结标准库Deque的设计方法和特性以及相关迭代器内部特征 1.Deque基本结构 Deque(双向队列)也号称连续空间(其实是给使用者一个善意的谎言,只是为了好用),其实它使用分段拼接起来的 ...
- C++标准库分析总结(四)——<Vector、Array、Forward_list设计原则>
本节主要总结标准库Vector和Array的设计方法和特性以及相关迭代器内部特征 1.Vector 1.1 Vector 内部实现 Vector是自增长的数组,其实在标准库中没有任何一种容器能原地扩充 ...
- C++标准库分析总结(九)——<HashFunction、Tuple>
一.HashFunction 当我们在使用hash table以及由它做底层的数据结构时,我们必不可少要讨论hash function,所谓的哈希函数就是产生一个数,这个数越乱越好,以至于达到避免碰撞 ...
- C++标准库分析总结(七)——<Hashtable、Hash_set、Hash_multiset、unordered容器设计原则>
编译器对关联容器的实现有两个版本,上一节总结了以红黑树做为基础的实现版本,这一节总结以哈希表(hash table,散列表)为底部结构的实现版本. 一.Hashtable简单介绍 Hashtable相 ...
- C++标准库分析总结(六)——<Map、Multimap、Set、Multiset设计原则>
关联容器我们可以看做是一个小型的数据库,它就是用key找value,编译器底层对于关联容器的实现有两种:红黑树(Red-Block tree)和哈希表(hash table,散列表). 一.红黑树简单 ...
- C++标准库分析总结(二)——<模板,分配器,List>
本节主要总结模板及其类模板分类以及STL里面的分配器.容器内部结构以及容器之间的关系和分类,还介绍了容器中List的结构分布 1.源代码版本介绍 1.1 VC的编译器源码目录: 2.类模板 2.1 类 ...
随机推荐
- 前端编译原理 笔记 -- BISON
前面总结的差不多了,这边记录下,零碎的相关阅读可以备忘的一些知识点 Bsion文档,下面是中文的地址 https://blog.csdn.net/chinamming/article/details ...
- 从客户发送http请求到服务器返回http之间发生了什么
由于我知识有限,可能会有模糊或者错误的地方,欢迎讨论与指正. 1.浏览器发出http请求 当用户访问一个url时,浏览器便会开始生成一个http请求. 首先获取http请求中所需要的参数,如url,c ...
- Vue组件component创建及使用
组件化与模块化的区别 什么是组件:组件的出现,就是为了拆分Vue实例的代码量,能够让我们以不同的组件,来划分不同的功能模块 ,将来我们需要什么功能,就可以去调用对应的组件即可 组件化与模块化的不同: ...
- 国内首本免费深度学习书籍!还有人没Get么?
这本书的作者很有趣鸭. 一开篇别的不说,先跟大家讲哲学,讨论人工智能实现的可能性.摘录一些他的结论: 人工智能可以实现 自由意志并不存在 量子力学并不能证明自由意志的存在 幸福感和物质水平提高并没有绝 ...
- kvm虚拟机控制台登录配置
vm虚拟机能否像xen虚拟机一样通过virsh console 一样采用字符界面进行linux虚拟机控制台呢,答案是肯定的,默认情况下该命令是不起作用的,需要修改相关文件才能实现. 本文出自:http ...
- markdown demo 学习
## <center>2019-05-08 12:05 DDoS攻击检测报告</center> ## - **MME ID**: 1123424 - **DDoS攻击类型**: ...
- linux网络编程之posix共享内存
今天继续研究posix IPC对象,这次主要是学习一下posix共享内存的使用方法,下面开始: 下面编写程序来创建一个共享内存: 编译运行: 那posix的共享内存存放在哪里呢?上节中学的posix的 ...
- P1462 通往奥格瑞玛的道路[最短路+二分+堆优化]
题目来源:洛谷 题目背景 在艾泽拉斯大陆上有一位名叫歪嘴哦的神奇术士,他是部落的中坚力量 有一天他醒来后发现自己居然到了联盟的主城暴风城 在被众多联盟的士兵攻击后,他决定逃回自己的家乡奥格瑞玛 题目描 ...
- 0019SpringBoot使用异步任务(多线程)与定时任务
SpringBoot开启异步任务只需要两步配置: 1.在主类上加上注解@EnableAsync开启异步功能 2.在service层的方法上加上注解@Async指定调用方法时是异步的 SpringBoo ...
- AJAX学习笔记——同源策略
同源策略 同源策略,所有浏览器都实行这个政策 最初,它的含义是指,A 网页设置的 Cookie,B 网页不能打开,除非这两个网页"同源".所谓"同源"指的是&q ...