【C++】STL中vector常见功能的模拟实现

2024-06-08 1195阅读

前言:在上一篇中我们讲到了Vector的一些常见功能的使用方式,今天为了进一步的去学习Vector和能够更深度的去理解Vector的一些底层的原理。

💖 博主CSDN主页:卫卫卫的个人主页 💞

👉 专栏分类:高质量C++学习 👈

💯代码仓库:卫卫周大胖的学习日记💫

💪关注博主和博主一起学习!一起努力!

【C++】STL中vector常见功能的模拟实现


目录标题

  • 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中可以存储各种类型的对象,因此我们使用模板【C++】STL中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)
            {
            }
            

            拷贝构造(传统写法)

            在拷贝构造中有两种写法,一个传统写法一个现代写法,由于传统写法要调用的函数我们得到后面才会去实现,所以现代写法作者就先放在后面了,这里先写的传统写法.

            1. 如果我们不自己实现,让编译器去实现,就是浅拷贝,会出现问题,故需我们自己实现深拷贝,v2(v1),即只要让v2拷贝一份新的数据即可(使v2和v1不是指向同一份数据)。
            2. 因此我们需要先开辟一块和需要拷贝的对象的同样大的空间,让新的对象指向这一块空间,在把值依次拷贝过去。(代码如下)
            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=

            代码思路:

            1. 传过来的对象会产生一个临时变量,临时变量会有一块独立的空间,这块空间和原本需要的值进行交换即达到了深拷贝的效果,然后返回*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 
VPS购买请点击我

免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

目录[+]