模拟vector
我们可以通过模板实现类似vector的类。我们实现一个StrVecTemp类,其内部通过allocator开辟空间,存储的类型用T来表示,T是模板类型。
1 | template <typename T> |
alloc在使用前要在类外初始化,因为是模板类,所以放在.h中初始化即可。
接下来我们要实现根据迭代器开始和结束的区间copy旧元素到新的空间里
1 | //实现区间copy |
实现copy构造
1 | //实现拷贝构造函数 |
实现copy赋值
1 | //拷贝赋值运算符 |
析构函数要先销毁数据再回收内存
1 | //析构函数 |
重新开辟空间
1 | template <class T> |
上面的函数用到了free函数,我们自己实现一个free
1 | template <typename T> |
压入元素和弹出元素
1 | //拷贝元素 |
接下来要实现emplace_back,因为emplace_back支持多种构造函数的参数,所以要用模板参数列表的方式定义该函数。
模板参数列表和形参列表都要用参数包的方式
1 | template <class T> |
Args是模板参数包,args是参数列表。因为construct的参数可能为右值引用,所以要用forward
1 | // forward既扩展了模板参数包Args,又扩展了函数参数包args |
总结
本文模拟实现了vector的功能。
视频链接https://www.bilibili.com/video/BV1Et4y1p73a/?vd_source=8be9e83424c2ed2c9b2a3ed1d01385e9
源码链接 https://gitee.com/secondtonone1/cpplearn