C++ STL源码剖析——P1、P2、P3、P4、P5、P6、P7
P1 认识headers、版本、重要资源
C++标准库中有百分之八十左右都是由 STL组成的
一、C++Standard Library 标准库 vs Standard Template Library (STL)标准模板库
C++标准库和STL的关系:
C++标准库>STL,STL包含的是六大部件,C++标准库还包含其他一些东西
C++标准库中有百分之八十左右都是由 STL组成的标准库以head files形式存在
(1)C++标准库的head files不带文件延申名(.h),例如#include<vector>
(2))新式 C head files 不带副档名 .h,例如 #include <cstdio>
(3)旧式C head files (带有副档名.h)仍然可用,例如#include<stidio.h>
二、常用网站:
cplusplus.com
cppreference.com
gcc.gnu.org
P2 STL 体系结构基础介绍
- 程序 = 数据结构 + 算法
一、STL 六大部件(components)
部件名称 | 英文名 | 作用 |
---|---|---|
容器 | Containers | 容器就是用来储存元素的,元素就需要占用内存,是用来解决内存的事情 |
分配器 | Allocators | 分配器是用来支持容器的,解决内存的事情 |
算法 | Algorithms | 具有某种功能的函数,算法可以独立出来,通过迭代器作用到多种容器 |
迭代器 | Iterators | 属于泛型指针,作为 算法和容器沟通的桥梁 |
适配器 | Adapters | 使 XX 看起来像是 XX, XX 可以是另外五种部件,都可以适当的转换 |
仿函数 | Functors | 其实,它的作用就相当于是一个函数 |
- 六大部件之间的关系:
- 容器用来存储元素,实现是一种class
- 分配器用来给容器分配内存大小
- 迭代器用来实现容器中元素的访问,是算法和容器之间的桥梁
- 算法可以独立出来,通过迭代器作用到多种容器
- 适配器用做对象的包装,使之适应不同的接口实现
- 仿函式是一种用来实现函数功能的class
在下图中,我们使用了:
1.一个容器vector
2.使用vector时,使用分配器allocator分配内存:vi是个数组(里面放着从ia头到ia尾的元素)
3.使用vi.begin(),vi.end()即迭代器,作为算法的参数,也就是让count_if去处理这些元素
4.使用count_if算法
5.使用仿函数less():小于40的元素有哪些?
6.使用函数适配器来对我们算法的结果进行进一步筛选(not1, bind2nd),not1变成找大于等于40的元素
二、容器区间
基本所有容器都有begin()和end()指针
- 如何定义一个iterator?
Contaniner<T>:: iterator ite=c.begin();
- 遍历容器:for/while
for(;ite!=c.end();++ite)
或者
while(ite!=c.end())
{++ite;
}
- 从C++11开始的新写法
- auto:类型自动推导
如下:ite的类型其实是list<string> :: iterator。但是我们用auto来代替。
P3 容器分类与各种测试(一)—— P6 容器分类与各种测试(四)
一、序列式容器
序列式容器的特点是将数据放进容器之后,会按照用户放进去的顺序依次排列
序列式容器 | 特点 |
---|---|
array | 一段连续空间,当初定了多大那就是多大空间,前面与后面是无法扩充的,不论是否使用,都会全部占用 |
vector | 尾部可进可出,当空间不够时会自动扩充 |
deque | 双向都可扩充,两端都可进可出 |
list | 一个双向环状链表,有向前和向后两个指针 |
forward_list | 一个单向链表,仅有向后一个指针,占用的内存比list |
二、关联式容器
关联式容器类似于key-value,非常适合于查找操作
关联式容器名 | 特点 | 实现 | 注释 |
---|---|---|---|
set/multiset | key和value是同一个,存储是有序的 | 红黑树 | 加上multi意味着可以加入重复键值对 |
map/multimap | 每一个key对应一个value,存储是有序的 | 红黑树 | 加上multi意味着可以加入重复键值对 |
unordered_set/unordered_multiset | 相对于set/multiset,存储是无序的 | 哈希表 | 加上multi意味着可以加入重复键值对 |
unordered_map/unordered_multimap | 相对于map/multimap,存储是无序的 | 哈希表 | 加上multi意味着可以加入重复键值对 |
P7分配器之测试
allopcator主要成员函数:
- allocate: 尝试分配n个size_type类型的存储空间,然后返回第一个元素的起始地址(只是分配空间,不构造对象)
函数原型:
pointer allocate(size_type n);
- deallocate: 释放先前allocate分配的且没有被释放的存储空间
原型函数:
void deallocate(pointer p, size_t n);
p:指向以前使用allocator :: allocate分配的存储块的指针。 n:在调用allocator :: allocate时为这个存储块分配的元素数量。
C++ STL源码剖析——P1、P2、P3、P4、P5、P6、P7相关推荐
- 设系统中有三种类型的资源(A,B,C)的五个进程(P1,P2,P3,P4,P5)。A资源的数量为17,B资源的数量为5,C资源的数量为20。在T0时刻系统状态如表所示。
银行算法应用 题目 设系统中有三种类型的资源(A,B,C)的五个进程(P1,P2,P3,P4,P5).A资源的数量为17,B资源的数量为5,C资源的数量为20.在T0时刻系统状态如表所示.系统采用银行 ...
- 【STL源码剖析】迭代器
[STL源码剖析]迭代器 第3章 迭代器(iterators)与traits编程技法(<STL源码剖析> ) 3.1 迭代器设计思维--STL关键所在 3.2 迭代器(iterator)是 ...
- STL源码剖析---移动advance
目录 一. 迭代器 二. 类型萃取机 2.1 处理类实现的迭代器 2.2 处理原生指针实现的迭代器 三. advance 3.1 iterator_category 3.2 激活重载机制 3.3 实现 ...
- STL源码剖析学习七:stack和queue
STL源码剖析学习七:stack和queue stack是一种先进后出的数据结构,只有一个出口. 允许新增.删除.获取最顶端的元素,没有任何办法可以存取其他元素,不允许有遍历行为. 缺省情况下用deq ...
- 《STL源码剖析》学习-- 1.9-- 可能令你困惑的C++语法1
最近在看侯捷的<STL源码剖析>,虽然感觉自己c++看得比较深一点,还是感觉还多东西不是那么明白,这里将一些细小的东西或者概念记录一下. 有些东西是根据<C++编程思想>理解的 ...
- 《STL源码剖析》学习--6章--_rotate算法分析
最近在看侯捷的<STL源码剖析>,其中有许多不太明白之处,后经分析或查找资料有了些理解,现记录一下. <STL源码剖析>学习--6章--random access ite ...
- 《STL源码剖析》学习--6章--power算法分析
最近在看侯捷的<STL源码剖析>,其中有许多不太明白之处,后经分析或查找资料有了些理解,现记录一下. 6章--power算法分析 书本中的算法如下所示: template <clas ...
- STL源码剖析——P142关于list::sort函数
在list容器中,由于容器自身组织数据的特殊性,所以list提供了自己的排序函数list::sort, 并且实现得相当巧妙,不过<STL源码剖析>的原文中,我有些许疑问,对于该排序算法,侯 ...
- STL源码剖析---红黑树原理详解下
转载请标明出处,原文地址:http://blog.csdn.net/hackbuteer1/article/details/7760584 算法导论书上给出的红黑树的性质如下,跟STL源码 ...
最新文章
- 11个三相异步电动机常见故障与维修方法。
- DWR推送的一些随笔
- Dubbo学习总结(2)——Dubbo架构详解
- 递推-练习2--noi3525:上台阶
- 信管 - 挣值 - 资料收集
- 以前自己用SDL写的一个小游戏:QuadraPop
- 2022年上半年系统集成项目管理工程师下午真题及答案解析
- android 仿站小工具,仿站小工具下载
- 计算机页面排版的笔记,爱记笔记却懒得排版?这款笔记 App 为你准备了最实用的经典模板:格子笔记...
- 在亚马逊工作是怎样一种体验?
- 恶劣的仿造文化:从meebo到米博
- rasp 系统_RASP 完爆 WAF 的5大理由!
- 阿里天池街景字符编码YOLO5方案
- 如何去除 录像开始和结束时 的噔噔噔噔声音
- 乐吾乐2D可视化绘图引擎
- 从华为P20开始的脑洞之旅:AI如何改变未来手机生活
- PHP中exit()与die()的区别
- JAVA+TEXT+小说速读训练器
- 欧式距离和马氏距离的关系(公式推导)
- 在 Mac 上重命名 Apple Magic Mouse的方法!
热门文章
- Spring项目的resources目录下的文件读取
- 行业盛会2014中国网络安全大会即将召开
- Suggestive Annotation: A Deep Active Learning Framework for Biomedical Image Segmentation
- QT之“蛛网图”自绘控件
- 在污水测量中各种不同的技术条件下的流量计选型说明
- QT-自动在线翻译工具,适用于国际化多语言应用
- estore电子商城-知识整合
- 基于esp32/8266语音门铃对讲机系统设计语音传输实时udp,espnow传输图像
- C++子线程让主线程执行回调
- 【Matlab 图像】图像颜色反转