实现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)//向容器末尾添加元素
{