目录
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