探索C++中的动态数组:实现自己的Vector容器

马肤
这是懒羊羊

探索C++中的动态数组:实现自己的Vector容器,请添加图片描述,词库加载错误:未能找到文件“C:\Users\Administrator\Desktop\火车头9.8破解版\Configuration\Dict_Stopwords.txt”。,操作,没有,程序,第1张

🎉个人名片:

🐼作者简介:一名乐于分享在学习道路上收获的大二在校生

🙈个人主页🎉:GOTXX

🐼个人WeChat:ILXOXVJE

🐼本文由GOTXX原创,首发CSDN🎉🎉🎉

🐵系列专栏:零基础学习C语言----- 数据结构的学习之路----C++的学习之路

🐓每日一句:如果没有特别幸运,那就请特别努力!🎉🎉🎉

————————————————

🎉文章简介:

🎉本篇文章将 介绍如何使用C++编写代码来实现一个类似于STL中的Vector容器 等学习的相关知识进行分享!

💕如果您觉得文章不错,期待你的一键三连哦,你的鼓励是我创作动力的源泉,让我们一起加 油,一起奔跑,让我们顶峰相见!!!🎉🎉🎉

——————————————————————————

一.前言

这篇文章将介绍如何使用C++编写代码来实现一个类似于STL中的Vector容器。Vector是一种动态数组,它可以根据需要自动调整大小,并提供了许多方便的方法来操作数据。在这篇文章中,你将学习如何使用指针和动态内存分配来创建一个可变大小的数组,并实现Vector的常见功能,如添加元素、删除元素、访问元素等。通过实现自己的Vector容器,你将更好地理解动态数组的原理和实现方式,并提升对C++语言的理解和掌握。

二.Vs下Vector的底层结构

vs下底层是一个类,类里面的成员变量包括三个指针,指针类型为所存储数据类型(T)的指针;

T* _start 指向的是存储数据所开空间的起始位置;

T* _finish 指向的是最后一个数据的下一个位置;

T* _endofstorage 指向的是所开空间的最后的下一个位置;

如图:

探索C++中的动态数组:实现自己的Vector容器,在这里插入图片描述,词库加载错误:未能找到文件“C:\Users\Administrator\Desktop\火车头9.8破解版\Configuration\Dict_Stopwords.txt”。,操作,没有,程序,第2张

public:
	typedef T* iterator;
	typedef const T* const_iterator;
private:
	iterator _start;
	iterator _finish;
	iterator _endofstorage;

三.vector的模拟实现

1.构造函数

1.直接初始化为空指针,使用时再开空间

vector()
	:_start(nullptr)
	,_finish(nullptr)         //也可以在定义的时候直接给缺省值
	,_endofstorage(nullptr)
{}

2.用一个迭代器区间构造(需要复用下面实现的push_back函数)

	template     //模板
	vector(intputiterator first, intputiterator last)
	{
		while (first != last)  //不能是用
			push_back(*first);    //依次取里面的数据尾插
			++first;
		}
	}

	resize(n,x);
}

	resize(n,x);
}

	if (n  capacity())
	{
		size_t old_size = size();      //旧空间有效数据个数
		size_t newcapacity = capacity() == 0 ? 4 : 2 * capacity();   //需要判断,因为可能为0
		iterator tmp = new T[newcapacity];     //开空间
		//memcpy(tmp, _start,old_size * sizeof(T));   //下面会将为什么不用memmove函数
		for (int i = 0; i  

为什么不用memmove?

当我们存储的数据类型为string时【如图一】每个string对象里面都有一个_str,指向一个字符串,当我们用memmove拷贝后,拷贝后的_str与拷贝前的_str指向同一块空间【如图二】,当我们释放_start的时候,会调用string的析构函数,将该空间释放掉,就会导致野指针问题;

探索C++中的动态数组:实现自己的Vector容器,在这里插入图片描述,词库加载错误:未能找到文件“C:\Users\Administrator\Desktop\火车头9.8破解版\Configuration\Dict_Stopwords.txt”。,操作,没有,程序,第3张

3.push_back函数

思路:检查是否空间满了,扩容,直接尾插

	void push_back(const T& x)
	{
		if (_finish == _endofstorage)    //检查是否需要扩容
		{
			reserve(capacity() == 0 ? 4 : 2 * capacity());
		}
		*_finish = x;     //尾插
		++_finish;    //更新下标
	}

4.push_back函数

思路:与顺序表实现一样,直接–_finish;

void pop_back()
{
	assert(size());   //检查是否还有有效数据可删
	--_finish;
}

5.resize函数

思路:

分为三种可能:

1.n>capacity 扩容+尾插

2.size if (n _finish = _start + n;; } else { if (n capacity()) //扩容 { reserve(n); } for (size_t i = size(); i _start[i] = x; //可以复用push_back函数 } _finish = _start + n; //更新 } } assert(pos); assert(pos = _start); //断言 assert(pos size_t len = pos - _start; //记录之前的值 reserve(capacity() == 0 ? 4 : 2 * capacity(); //扩容 pos = _start + len; //更新pos下标 } //memmove(pos+1, pos, sizeof(T) * (_finish - pos)); iterator end = _finish-1; while (end=pos) { *(end+1) = *end; //拷贝 end--; } *pos = x; //插入 ++_finish; return pos; //返回pos位置的迭代器,防止迭代器失效问题 } assert(pos


文章版权声明:除非注明,否则均为VPS857原创文章,转载或复制请以超链接形式并注明出处。

发表评论

快捷回复:表情:
评论列表 (暂无评论,0人围观)

还没有评论,来说两句吧...

目录[+]

取消
微信二维码
微信二维码
支付宝二维码