初级项目_MyTinySTL

项目参考:https://github.com/Alinshans/MyTinySTL
文章参考:


2022/8/7 本来是打算好好把C++的书看完再来整STL这个专题的,但是看书真的太容易犯困了,最近效率也是特别低,所以就直接找个项目练练。

2022/10/20 9:06 刚刚重新看了一下相关的资料,然后相较于之前有了更多体会吧,网上不成文的那种解说写的是真的很差…所以我们还是考虑自学,首先把C/C++相关的知识点重新看一遍,接着把STL初级的知识点复习一遍,然后就可以结合代码进行理解,最后再看STL源码剖析完成整体的STL学习;


概述(一)

1.文件概述

关于STL是什么我们在《STL初级》里面已经介绍过了,然后GitHub上的文件下载下来之后其实我是一脸懵的…因为这个文件的内容太神奇了(主要我搞不懂为什么它不能像正常的项目一样源文件和头文件有对应,全是头文件真的劝退…或许我们自己实现的时候可以优化一下??)

PS:作者这样构建文件是有原因的,因为我们的目标是实现一个简单的STL库,使用头文件组织的方式便于单元测试(至于为什么不使用和JSON那个项目相同的单元测试可能是因为选择的测试框架不同,但实际上两种框架都可以使用)

MyTinySTL中存放的文件就是作者手动实现的STL六大组件,主要分布如下(参考自https://blog.csdn.net/qq_40571533/article/details/102558371)

Test文件夹中存放的是用于测试的函数,具体文件关系如下图所示

WIKI文件夹中存放的是作者自己编写的文档,我们可以结合该文档和网络上的资源一起学习;

2.组件概述

  1. 分配器:用来管理内存;
  2. 迭代器:将容器和算法粘合在一起,用来遍历STL容器中的部分或全部元素;
  3. 容器:封装了大量常用的数据结构;
  4. 算法:定义了一些常用算法;
  5. 仿函数:具有函数特质的对象;
  6. 适配器:主要用来修改接口;

3.test.h分析

test.h文件主要用于测试我们自定义的容器,首先定义了输出的颜色,green代表成功,red代表失败

1
2
#define green redbud::io::state::manual << redbud::io::hfg::green
#define red redbud::io::state::manual << redbud::io::hfg::red

接着定义了两个类,分别是单个测试和多个测试

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// 封装单个测试案例
class TestCase
{
public:
// 构造函数,接受一个字符串代表案例名称
TestCase(const char* case_name) : testcase_name(case_name) {}
// 一个纯虚函数,用于测试案例
virtual void Run() = 0;
public:
const char* testcase_name; // 测试案例的名称
int nTestResult; // 测试案例的执行结果
double nFailed; // 测试失败的案例数
double nPassed; // 测试通过的案例数
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// 单元测试,把所有测试案例加入到 vector 中,依次执行测试案例
class UnitTest
{
public:
// 获取一个案例
static UnitTest* GetInstance();
// 将案例依次加入 vector
TestCase* RegisterTestCase(TestCase* testcase);
void Run();
public:
TestCase* CurrentTestCase; // 当前执行的测试案例
double nPassed; // 通过案例数
double nFailed; // 失败案例数
protected:
std::vector<TestCase*> testcases_; // 保存案例集合
};

接着文件中出现了大量的宏定义用于断言操作(宏定义的用法很广泛,具体使用可以自行Google)


初级项目_MyTinySTL
https://gintoki-jpg.github.io/2022/08/07/项目_MyTinySTL/
作者
杨再俨
发布于
2022年8月7日
许可协议