C++项目笔记——MyTinySTL(1)概述
项目地址:ww1820/MyTinySTL: A tiny STL in C++11,练手项目 (github.com)
STL(Standard Template Library)
- C++ Standard Library,C++ 标准库
- C++ Standard Template Library,C++ 标准模板库
STL 是 C++ 标准库的一部分,不用单独安装。. C++ STL 借助模板(Template)把常用的 数据结构 及其算法都实现了一遍,并且做到了数据结构和算法的分离(GP vs. OOP)。
C++标准库以头文件的形式呈现:
- 新式C++头文件不带
.h
后缀,如#include<vector>
- 旧式C++头文件带
.h
后缀,如#include<stdio.h>
- 新式头文件内的组件封装于
namespace std
- 旧式头文件内的组件不封装于
namespace std
六大组件
- 分配器(Allocators):内存管理。
- 迭代器(Iterators):泛化的指针,算法通过迭代器访问容器中的数据。
- 容器(Containers):封装了大量常用的数据结构。
- 算法(Algorithms):定义了一些常用算法,处理数据。
- 仿函数(Functors):具有函数特质的对象(重载
operator()
的类)。 - 适配器(Adapters):修改接口。
容器的分类与结构
- 顺序容器:
- Array:长度固定的数组,存储空间连续,支持随机访问
- Vector:动态数组,存储空间连续,支持随机访问
- Deque:双端队列,存储空间分段连续,支持随机访问
- List:双向链表,存储空间不连续,不支持随机访问
- Forward-List:单向链表,存储空间不连续,不支持随机访问
- 关联容器:红黑树实现,有序。Multi的key可以重复
- Set/MultiSet
- Map/MultiMap
- 无序容器:哈希表(Separate Chaining)实现
- Unoedered Set/MultiSet
- Unoedered Map/MultiMap
C++ Primer 中指出
string
是与vector
相似的容器,但专门用于保存字符。随机访问块。在尾部插入/删除速度快。deque由若干段连续空间串接而成,一旦有必要在deque的头部或尾端增加新的空间,便配置一段定量连续的空间,串接在deque的头部或尾端。deque的最大任务,就是在这些分段连续的空间上维护其整体连续的假象,并提供随机存取的接口。
deque首次插入一个元素,默认会动态分配512字节空间,当这512字节空间用完后,它会再动态分配自己另外的512字节空间,然后虚拟地连在一起。deque的随机访问和遍历性能比vector差。
测试
主要文件结构
1 |
|
测试程序
1 |
|
关于宏的两点:
特殊符号
#
和##
#
: 预处理时,将#
后连接的实参字符串化##
:一种分隔连接方式,它的作用是先分隔,然后进行强制连接。在普通的宏定义中,预处理器一般把空格解释成分段标志,对于每一段和前面比较,相同的就被替换。但是这样做的结果是,被替换段之间存在一些空格。如果我们不希望出现这些空格,就可以通过添加一些##
来替代空格。例如:
1
2
3
4
5#define TYPE1(type,name) type name_##type##_type
#define TYPE2(type,name) type name##_##type##_type
TYPE1(int, c); // int name_int_type; (因为##号将后面分为 name_ 、type 、 _type三组,替换后强制连接)
TYPE2(int, d); // int d_int_type; (因为##号将后面分为 name、_、type 、_type四组,替换后强制连接)宏定义中的
do{ }while(0)
使用do{…}while(0)构造后的宏定义不会受到大括号、分号等的影响,总是会按你期望的方式调用运行。
1 |
|
预处理阶段,上述代码在TEST
处展开后,TEST
后面{...}
的内容将拼接到 Run()
后,成为Run()
的实现。
MYTINYSTL_TEST_(testcase_name)
展开后声明一个名为 testcase_name_TEST
的类(testcase_name
是形参),13行声明了一个静态指针常量成员,指向一个测试用例,16行对该静态成员进行定义,并将其加入到用例集合中。
参考
[1] MyTinySTL阅读笔记—概述_xiaoxiao涛的博客-CSDN博客_mytinystl源码分析
[2] Alinshans/MyTinySTL: Achieve a tiny STL in C++11 (github.com)