【C++详解】——vector模拟实现

 


目录

vector简述以及各函数接口总览

简单介绍

vector成员变量

 模拟实现总览

模拟实现过程

迭代器相关函数

容量和大小相关函数

size和capacity 

reserve 

resize 

empty

 内容修改函数

 push_back

pop_back

 insert

 erase

swap

operator[] 

默认成员函数

构造函数1

构造函数2

构造函数3

拷贝构造(传统实现方式)

拷贝构造(现代写法)

赋值运算符重载 

析构函数


vector简述以及各函数接口总览

简单介绍

       vector是表示大小可以更改的数组的序列式容器。

就像数组一样,vector为其元素使用连续的存储位置,这也就意味着可以使用指向其元素的常规指针的偏移量来访问它们的元素,使用这种访问方式的速度基本上接近数组。但与数组不同的是,vector的大小支持动态变化(它们的存储可由容器自动处理)。

在vector内部中,vector会使用动态分配的数组来存储其元素。为了在插入新元素时增加大小可能需要重新分配此数组,vector将会开辟一个新数组并将所有元素移动到其中。就处理时间而言,这是一项相对昂贵的任务,因此,每次将元素添加到容器时,vector不会每一个次都重新分配。简单来说,vector只有在扩容时会重新开辟空间拷贝数据,并且vector没有缩容操作

vector可能会分配一些额外的存储空间以适应可能的增长,因此,容器的实际容量可能大于包含其元素所需的存储量。即vector中的capacity和size。vector与数组相比会消耗更多的内存,以换取管理存储和以高效方式动态增长的能力。

vector成员变量

先看一看vector的源码,我们再进行模拟实现。

 在vector当中有三个成员变量_start、_finish、_endofstorage。

与string不同的是,vector使用了三个迭代器。

  • _start指向容器的头
  • _finish指向容器当中有效数据的尾
  • _endofstorage指向整个容器的尾

 模拟实现总览

//使用命名空间避免与库中的vector冲突
namespace my_vector
{
	//模拟实现vector
	template<class T>
	class vector
	{
	public:
		typedef T* iterator;
		typedef const T* const_iterator;

		//默认成员函数
		vector();                                           //构造函数
		vector(size_t n, const T& val);                     //构造函数
		template<class InputIterator>                      
		vector(InputIterator first, InputIterator last);    //构造函数
		vector(const vector<T>& v);                         //拷贝构造函数
		vector<T>& operator=(const vector<T>& v);           //赋值运算符重载函数
		~vector();                                          //析构函数

		//迭代器相关函数
		iterator begin();
		iterator end();
		const_iterator begin()const;
		const_iterator end()const;

		//容量和大小相关函数
		size_t size()const;
		size_t capacity()const;
		void reserve(size_t n);
		void resize(size_t n, const T& val = T());
		bool empty()const;

		//修改容器内容相关函数
		void push_back(const T& x);
		void pop_back();
		void insert(iterator pos, const T& x);
		iterator erase(iterator pos);
		void swap(vector<T>& v);

		//访问容器相关函数
		T& operator[](size_t i);
		const T& operator[](size_t i)const;

	private:
		iterator _start;        //指向容器的头
		iterator _finish;       //指向有效数据的尾
		iterator _endofstorage; //指向容器的尾
	};
}

模拟实现过程

迭代器相关函数

为了方便实现下面的默认成员函数的现代写法,我们需要先实现迭代器相关函数,以及获取vector的容量和大小的函数,实现过程也较为简单。

//迭代器相关函数
    
    typedef T* iterator;
	typedef const T* const_iterator;
	
    iterator begin()
	{
		return _star
  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hrimkn

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值