【c++模板】——STL向量容器vector以及容器空间配置器alloctor的实现

本文介绍了C++ STL中的向量容器vector的基本概念、特点及内部工作原理,包括动态扩展机制和线性顺序结构。同时讨论了在实现过程中遇到的问题,如初始化时的对象构造和析构,以及如何通过容器空间配置器allocator来解决这些问题,确保对象构造与内存管理的分离,提高性能。
摘要由CSDN通过智能技术生成

一、STL向量容器vector简单实现

1、容器的定义
首先,我们来了解一下什么是容器,他的书面解释各位可以百度,在这儿我们就用一种通俗的方式来解释他,容器就是保存其他对象的对象。而且这种对象还有处理其他对象的方法。

C++采用基于模版的方式处理容器,STL中的容器提供了多种数据结构。

2、vector容器
(1)定义
是一个线性顺序结构。相当于数组,但其大小可以不预先指定,并且自动扩展。它可以像数组一样被操作,由于它的特性我们完全可以将vector 看作动态数组。

(2)特点

  • 可以直接访问任何元素。
  • 线性顺序结构。可以指定一块连续的空间,也可以不预先指定大小,空间可自动扩展,也可以像数组一样被操作,即支持[ ]操作符和vector.at(),因此可看做动态数组,通常体现在追加数据push_back()和删除末尾数据pop_back()。
  • 当分配空间不够时,vector会申请一块更大的内存块(以2的倍数增长),然后将原来的数据拷贝到新内存块中并将原内存块中的对象销毁,最后释放原来的内存空间。因此如果vector保存的数据量很大时会很消耗性能,因此在预先知道它大小时性能最优。
  • 节省空间。因为它是连续存储,在存储数据的区域是没有浪费的,但实际上大多数时候是存不满的,因此实际上未存储的区域是浪费的
  • .在内部进行插入和删除的操作效率低。由于vector内部按顺序表结构设计,因此这样的操作基本上是被禁止的,它被设计成只能在后端进行追加和删除操作。
    他的布局如下:
    在这里插入图片描述
    下面我们来看看他的具体代码实现:
 template<typename T>
class vector
{
   
public:
	vector(int size = 10)
	{
   
		_first = new T[size];
		_last = _first;
		_end = _first + size;
	}
	~vector()
	{
   
		delete[] _first;
		_first = _last = _end = nullptr;
	}
	vector(const vector<T>& rhs)
	{
   
		int size = rhs._end - rhs._first;
		_first = new T[size];
		//拷贝有效元素
		int len = rhs._last - rhs._first;
		for (int i = 0; i < len; ++i)
		{
   
			_first[i] = rhs._first[i];
		}
		_last = _first + len;
		_end = _first + size;
	}
	vector<T>& operator = (const vector<T>& rhs)
	{
   
		if (this == &rhs)
			return *this;

		delete[] _first;

		int size = rhs._end - rhs._first;
		_first = new T[size];
		int len = rhs._last - rhs._first;
		for (int i = 0; i < len; ++i)
		{
   
			_first[i] = rhs._first[i];
		}
		_last = _first + len;
		_end = _first + size;
		return *this;
	}
	void push_back(const T &val)//向容器末尾添加元素
	{
   
		if (full())
			expand()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值