c++之stl_vector
文章目录
一、vector的内存结构
vector容器对应为c#中的list容器,内存是连续的,底层是c风格数组。
-
优点:
- 随机存取。通过索引器,即[]操作符,可以非常方便的读取,写入,修改。
- 动态分配内存。当数据过多装不下的时候,可以扩充内存。
-
缺点:
- 由于是连续空间,插入操作会对数据进行移动,如果插入到首位元素,那么后面的元素都要往后推动。因此,vector只提供push_back接口,并且尽量少用insert方法。
- 动态内存分配是一把双刃剑。当原有内存空间不够的时候,会重新分配新内存,然后进行拷贝操作。当数据量多的时候,这也是比较消耗性能的。可以预估,给一个相对合适的初始大小,以减少重新分配内存以及拷贝操作。
接下来看看vector是怎么设计的。
从图中可以看出,vector只需要3根指针
即可实现,且内存为两倍增长
。vector默认capacity为8,图中只是为了简化。
二、具体实现
1. vector的迭代器
前面提到,vector只需要三根指针,start、finish、end_of_storage。由于是一个c风格数组,所以不需要对迭代器做特殊设计。
public:
typedef T value_type;
typedef value_type *iterator;
typedef value_type &ref;
protected:
iterator start;
iterator finish;
iterator end_of_storage;
public:
ref operator[](size_type n) {
return *(begin() + n);}
iterator begin() const {
return start;}
iterator end() const {
return finish;}
2. vector的常用方法
void push_back(const value_type &val);
void pop_back(const value_type &val);
size_type size() const {
return end() - begin();}
size_type capacity() const {
return end_of_storage - begin();}
3. vector的扩容方法
void expand(const size_type &_size);
iterator copy_vector(const iterator &first, const iterator &last, iterator &new_pos);
4. 完整代码
#if !defined(_M_VECTOR_)
#define _M_VECTOR_
#include <memory>
namespace learnCpp
{
template <class T>
class m_vector
{
public:
typedef T value_type;
typedef value_type *iterator;
typedef value_type &ref;
typedef size_t size_type;
protected:
iterator start;
iterator finish;
iterator end_of_storage;
public:
m_vector(const size_type capacity = 8)
: start(new value_type[capacity]),
finish