【C++】STL中vector常见功能的模拟实现
前言:在上一篇中我们讲到了Vector的一些常见功能的使用方式,今天为了进一步的去学习Vector和能够更深度的去理解Vector的一些底层的原理。
💖 博主CSDN主页:卫卫卫的个人主页 💞
👉 专栏分类:高质量C++学习 👈
💯代码仓库:卫卫周大胖的学习日记💫
💪关注博主和博主一起学习!一起努力!
目录标题
- Vector的大体框架
- Vector中的构造函数
- 无参构造
- 拷贝构造(传统写法)
- 析构函数
- swap函数
- 赋值重载operator=
- Vector容器中的遍历方式
- operator[]遍历容器
- 迭代器的遍历和范围for
- 打印函数print_vector(const vector& v)
- Vector容器中相关的增删查改的函数
- 查看容器中有效元素的个数- size()
- 查看容器中国的容量的大小- capacity()
- 调整和检查容量的大小- reserve(size_t n)
- 调整向量的大小-resize(size_t n, const T& value = T())
- 尾插数据- push_back(const T& val)
- 尾删数据-pop_back()
- 插入数据-insert(iterator pos,const T& val)
- 删除数据- erase(iterator pos)
- 查看容器中的数据是否为空Empty()
- vector中构造函数的一点延伸
- 拷贝构造的现代写法
- 区间构造函数
- 列表初始化构造(c++11以上的写法)
- 总体代码
Vector的大体框架
在vector中本质是由三个指针变量组成的,且vector中可以存储各种类型的对象,因此我们使用模板

namespace bit { template//因为在使用的时候Vector中可以是任意类型所以我们调用模板 class vector { public: typedef T* iterator;//迭代器 typedef const T* const_iterator; private: iterator _start = nullptr; //容器的起始位置 // T* _start iterator _finish = nullptr;//容器中所使用的元素的最后一个位置 iterator _endofstorage = nullptr;//容器中所有元素的最后一个位置 }; }Vector中的构造函数
无参构造
我们也可以直接在成员变量中对其直接给初始值,不写这个无参构造函数也是可以的。
vector() :_start(nullptr) , _finish(nullptr) , _endofstorage(nullptr) { }拷贝构造(传统写法)
在拷贝构造中有两种写法,一个传统写法一个现代写法,由于传统写法要调用的函数我们得到后面才会去实现,所以现代写法作者就先放在后面了,这里先写的传统写法.
- 如果我们不自己实现,让编译器去实现,就是浅拷贝,会出现问题,故需我们自己实现深拷贝,v2(v1),即只要让v2拷贝一份新的数据即可(使v2和v1不是指向同一份数据)。
- 因此我们需要先开辟一块和需要拷贝的对象的同样大的空间,让新的对象指向这一块空间,在把值依次拷贝过去。(代码如下)
vector(const vector& V) { //传统写法 _start = new T[V.capacity()]; _finish = _start;//让_finish指向现在的位置,然后依次进行赋值 _endofstorage = _start + V.capacity(); for (size_t i = 0; i析构函数
关于析构函数这里就不过多的介绍了,就是把容器给销毁,然后置空即可。
~vector() { delete[] _start; _start = _finish = _endofstorage = nullptr; }swap函数
void swap(vector& v) { std::swap(_start, v._start); std::swap(_finish, v._finish); std::swap(_endofstorage, v._endofstorage); }赋值重载operator=
代码思路:
- 传过来的对象会产生一个临时变量,临时变量会有一块独立的空间,这块空间和原本需要的值进行交换即达到了深拷贝的效果,然后返回*this即可达到连续赋值的效果。
vector& operator=(vector v)//现代写法 { swap(v); return *this; }Vector容器中的遍历方式
operator[]遍历容器
1.我们通过运算符重载可以写出两个operator的容器的遍历方式,一种是可以对其进行修改和操作,一种是只可以对其进行操作不可以修改
T& operator[](size_t pos) { assert(pos迭代器的遍历和范围for
当然了,迭代器也有可读和可写的两个版本(如下所示),且我们在前面的学习中知道,范围for的本质也就是迭代器进行遍历,只要有迭代器我们就能实现范围for了。
iterator begin()//返回起始位置 { return _start; } iterator end()//结束位置 { return _finish; } const_iterator begin() const { return _start; } const_iterator end()const { return _finish; } void test2() { vector v1; v1.push_back(1); v1.push_back(1); v1.push_back(1); v1.push_back(1); cout cout for (size_t i = 0; i
免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

