一.了解项目功能
声明: 该模拟实现仅适用于STL初学小白了解vector的简单实现,会结合一些STL源码作为参照,但是源码中涉及的空间配置器部分我们不做涉及! 在本篇博文中,将使用new/delete等方式来完成C 的动态内存的申请与释放.该方式相比于空间配置器效率有所降低,但是初学者较为友好的一种初步了解STL的一种方式.
在上篇博客中我们详细介绍了C 标准库vector对象集合,包含它的常用成员函数及其使用示例: 【C 】标准库类型vector
https://blog.csdn.net/weixin_72357342/article/details/139740266?spm=1001.2014.3001.5501而在本次项目中我们的目标是模拟实现一个vector对象集合类模板: 该对象集合包含三个成员变量,分别是:
- iterator类型成员变量_start,是指向vector开始位置的迭代器.
- iterator类型成员变量_finish,是指向vector最后一个有效元素的后一位置的迭代器.
- iterator类型成员变量_endofstorage,是指向vector最后一个有效容量的后一位置的迭代器.
可能大家会感到陌生,vector的成员变量不应该是一个T*的数据指针加上两个size_t的大小和容量的组合吗,为什么会是三个迭代器,这个我们具体会在"构造成员变量"部分细讲,这里只是介绍一下vector的组成.vector成员变量组成图示如下:
模拟实现的成员函数有:
- 构造函数,拷贝构造函数,赋值运算符重载和析构函数
- size()函数
- capacity()函数
- reserve()函数
- resize()函数
- push_back()函数
- pop_back()函数
- insert()函数
- erase()函数
- swap()函数
- 运算符重载函数,包括: []
- 迭代器相关函数,包括:begin()函数,end()函数
注意,因为我们要实现的vector类并不只满足于只能存储一种固定类型的元素,我们在一个项目中,可能会创建几个存储不同类型元素的vector,如:
代码语言:javascript复制vector<int> vage; //存放学生年龄
vector<string> vname; //存放学生姓名
vector<double> vhigh; //存放学生身高
vector<Student> vstu; //存放自定义学生类
因此,我们需要将vector实现为一个类模板,这样才可以满足上面的需求,有关C 泛型编程模板相关知识还不是很了解的朋友可以先移步:
【C 】初阶模板
https://blog.csdn.net/weixin_72357342/article/details/137910913?spm=1001.2014.3001.5502
二.逐步实现项目功能模块及其逻辑详解
通过第一部分对项目功能的介绍,我们已经对vector的功能有了大致的了解,虽然看似需要实现的功能很多,貌似一时间不知该如何下手,但我们可以分步分模块来分析这个项目的流程,最后再将各部分进行整合,所以大家不用担心,跟着我一步一步分析吧!
!!!注意,该部分的代码只是为了详细介绍某一部分的项目实现逻辑,故可能会删减一些与该部分不相关的代码以便大家理解,需要查看或拷贝完整详细代码的朋友可以移步本文第三部分。