vector实现

typedef int size_type;
/*
vector维护的是一个连续线性空间,提供的迭代器是Random Access Iterators即普通指针
*/
template <class T,class Alloc=alloc>
class vector
{
protected:
    iterator start;//目前使用空间的头
    iterator finish;//目前使用空间的尾
    iterator end_of_storage;//目前可用空间的尾
public:
    void push_back(const T& x);
    void insert_aux(iterator position, const T& x);
    int size()const{ return int(end() - begin()); }
};

/*
vector动态增加大小,并不是在原空间之后开辟新空间,因为无法保证原空间之后尚有可供配置的空间,而是以
原大小的两倍另外配置一块较大空间,然后将原内容拷贝过来,然后才开始在原内容之后构造新元素,并释放原空间
*/
template<class T,class Alloc=alloc>
void vector::push_back(const T& x)
{
    if (finish != end_of_storage)
    {
        construct(finish, x);
        ++finish;
    }
    else//已无备用空间
        insert_aux(end(), x);
}

template<class T, class Alloc = alloc>
void vector<T, Alloc>::insert_aux(iterator position, const T& x)
{
    const size_type old_size = size();
    const size_type len = old_size != 0 ? 2 * old_size : 1;
    /*
    配置原则:若原空间大小为0,则配置一个元素大小,否则配置原大小的两倍
    前半段用来放置原数据,后半段用来放置新数据
    */
    //data_allocator为vector专有的空间配置器
    iterator new_start = data_allocator::allocate(len);
    iterator new_finish = new_start;
    //将原vector的内容拷贝到新vector
    new_finish = uninitialized_copy(start, position, new_start);
    //为新元素设定初值x
    construct(new_finish, x);
    ++new_finish;

    //析构并释放原vector
    destroy(begin(), end());
    deallocate();

    //调整迭代器
    start = new_start;
    finish = new_finish;
    end_of_storage = new_start + len;
}

 

posted @ 2015-01-13 13:39  合唱团abc  阅读(170)  评论(0编辑  收藏  举报