C++模板编程——实现C++ STL向量容器vector、容器空间配置器allocator的重要性

实现C++ STL向量容器vector

vector 是同一种类型的对象的集合,每个对象都有一个对应的整数索引值。和 string 对象一样,标准库将负责管理与存储元素相关的内存。我们把 vector 称为容器,是因为它可以包含其他对象。一个容器中的所有对象都必须是同一种类型的。 使用 vector 之前,必须包含相应的头文件:
#include < vector >
using std::vector;
vector 是一个类模板(class template)。使用模板可以编写一个类定义或函数定义,而用于多个不同的数据类型。因此,我们可以定义保存 string 对象的 vector,或保存 int 值的 vector,又或是保存自定义的类类型对象(如 Sales_items 对象)的 vector。将在第十六章介绍如何定义程序员自己的类模板。幸运的是,使用类模板时只需要简单了解类模板是如何定义的就可以了。 声明从类模板产生的某种类型的对象,需要提供附加信息,信息的种类取决于模板。以 vector 为例,必须说明 vector 保存何种对象的类型,通过将类型放在类型放在类模板名称后面的尖括号中来指定类型
vector< int> ivec; // ivec holds objects of type int
vector< Sales_item> Sales_vec; // holds Sales_items
和其他变量定义一样,定义 vector 对象要指定类型和一个变量的列表。上面的第一个定义,类型是 vector< int>,该类型即是含有若干 int 类型对象的 vector,变量名为 ivec。第二个定义的变量名是 Sales_vec,它所保存的元素是 Sales_item 类型的对象。 vector 不是一种数据类型,而只是一个类模板,可用来定义任意多种数据类型。vector 类型的每一种都指定了其保存元素的类型。因此,vector< int> 和 vector< string> 都是数据类型。

下面我们将定义一个vector向量容器(属性):

private:
	//T *pvec;		//通常定义的情况
	//int _cur;		//有效元素的个数
	//int _size;	//总长度
	T *_first;  //指向数组的起始位置
	T *_last;   //指向数组有效元素的后继位置
	T *_end;    //指向数组元素的后继位置

类模板 实现一个C++ STL里面的一个顺序容器 vector 向量容器,实现vector容器的源码1

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._last;
		_first = new T[size];
		int len = rhs._last - rhs._first;
		for (int i = 0; i < len; ++i)//这里直接用rhs._last代替len可以吗?
		{
   
			_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._last;
		_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)//向容器末尾添加元素
	{
   
		
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值