基于 C++11
的 tinySTL
,这是我的第二个项目,本项目参考了github上的一些优秀的开源项目,同时也参考了侯捷老师的《STL源码剖析》,书中的一些实例让我对C++标准库有了更深层次的了解。
本项目选择了vector、list、deque和unordered_map五类常用容器进行实现,同时可以搭配迭代器进行使用,后面对标准库的容器和算法编写了单元测试用例,其中用宏定义封装了很多测试过程,这也是我第一次自己使用C++编写测试框架,无论是从容器实现还是测试,这个项目都带给我很大的收获。
本项目主要分为两部分,一部分为迭代器和STL容器的实现,另一部分是每个容器的单元测试。
第一部分的需要了解容器内部的底层机制并且细节比较多,其中迭代器的实现花费时间和精力最多。
第二部分,测试经历了多次迭代,一开始通过打印输出,后面专门设计了一个测试框架:
测试用例类: 成功数 失败数 执行结果 测试名称 run函数:纯虚函数,根据容器不同自定义不同的执行方式
单元测试类:(采用单例模式实现) 当前测试用例 测试通过数 测试失败数 测试用例集合 run函数:用于执行所有case并汇总结果
首先将所有的testcase加到单元测试中,然后调用示例的run方法,将所有的case执行一遍,最后输出测试结果。 测试数据以int为主,具体数值使用rand()随机初始化,使用stl容器和自己容器结果对比,根据结果不同设置大量的断言。
性能测试采用C语言库clock函数进行计时,插入数据随机生成,结果转化后输出,整体性能与STL标准模板库相差不大。
-
使用 VS 打开
- 克隆仓库
- 使用
vs2015
打开MSVC/MyTinySTL_VS2015.sln
,配置成Release
模式后,直接开始执行。
本次测试分为迭代器和容器两部分,其中迭代器的测试放在四个不同容器下,针对四个不同容器的不同类别的方法展开测试。下面是具体的测试用例的编写:
vector: vector是一个经典的基于动态数组的数据结构,测试时要特别注意容器扩容和迭代器失效的问题。
deque: deque是一个典型的双端队列,针对其测试用例的设计相比vector会有pop_front和push_front两个首部元素的增删方法。
list: list底层结构是一个链表,其测试用例的设计和deque相差并不大,所以在STL中会多一些链表的操作方法,比如链表和并,链表去重和链表排序等。
unordered_map: unordered_map的底层是哈希表,使用拉链法解决哈希冲突的问题,在元素数量超过哈希桶时,会选择一块新接近于原内存两倍的的内存重新哈希,其有一些独特的方法,实现起来和序列式容器略有不同。