C++ STL vector实现(二)

   上一篇我们讨论了vector的声明,接下来您将看到的是vector的接口和实现。

  class vector {

   public:

   ...

    iterator begin() { return start; } //返回vetor的首
    const_iterator begin() const { return start; } //只读访问
    iterator end() { return finish; } //返回vector的末尾
    const_iterator end() const { return finish; } //只读访问
    reverse_iterator rbegin() { return reverse_iterator(end()); } //反向迭代器
    const_reverse_iterator rbegin() const {
        return const_reverse_iterator(end());
    } //只读访问
    reverse_iterator rend() { return reverse_iterator(begin()); } //反向迭代器
    const_reverse_iterator rend() const {
        return const_reverse_iterator(begin());
    }
    size_type size() const { return size_type(end() - begin()); } //size,vector的长度
    size_type max_size() const { return size_type(-1); }  //vector支持的最大长度,4294967295
    size_type capacity() const { return size_type(end_of_storage - begin()); } //vector的当前   容量.表示当前的vector有多大的容量。
    bool empty() const { return begin() == end(); } //判断vetor是否为空,实现保证这个函数永远是常量时间复杂度。判断vector为空间已用empty,不要用size()==0,因为size()有可能是线性时间复杂度。
    reference operator[](size_type n) { return *(begin() + n); } //  []操作符
    const_reference operator[](size_type n) const { return *(begin() + n); } //只读

   vector() : start(0), finish(0), end_of_storage(0) {} //默认构造函数

   vector(size_type n, const T& value) {  //初始化长度为n,每个值均为value的vetor
    start = data_allocator::allocate(n); //vector的内存分配委托给allocator来实现
    iterator first = start;

    while(n--)

    {

         *first++ = value;

    }
    finish = start + n;
    end_of_storage = finish;
    }


    vector(size_type n) { //初始化长度为n,每个值均为默认值的vector
    start = data_allocator::allocate(n);
    while(n--)

    {

         *first++ = T();

    }   

    finish = start + n;
    end_of_storage = finish;
    }


    vector(const vector<T /*, Alloc*/>& x) {  //拷贝构造函数
    start = data_allocator::allocate(x.end() - x.begin());

    finish = start;

    for(iterator i = x.begin(); i != x.end(); ++i )

    {

        *finish++ = *i;

    }
    end_of_storage = finish;
    }

   
    vector(const_iterator first, const_iterator last) { //迭代器构造函数
    size_type n = 0;
    distance(first, last, n); //判断first到last的距离
    start = data_allocator::allocate(n);
    finish = start;

    for(iterator i = x.begin(); i != x.end(); ++i )

    {

        *finish++ = *i;

    }
    end_of_storage = finish;
    }


    ~vector() {   //vector的析构函数
    destroy(start, finish);  //调用每个元素的析构函数
    deallocate(); //释放vector的内存
    }
    vector<T /*, Alloc*/>& operator=(const vector<T /*, Alloc*/>& x);
    void reserve(size_type n) {  //vector的reverse函数,主要是用作vector的扩容,增加vector的容量到 n所制定的大小。为了防止vector发生过多的插入拷贝,建议用此函数为vector申请足够大的容量
    if (capacity() < n) {
            const size_type old_size = size();
        const iterator tmp = data_allocator::allocate(n);
        uninitialized_copy(begin(), end(), tmp);
        destroy(start, finish);
        deallocate();
        start = tmp;
        finish = tmp + old_size;
        end_of_storage = start + n;
    }
    }
    reference front() { return *begin(); } //返回vector的第一个元素
    const_reference front() const { return *begin(); } //
    reference back() { return *(end() - 1); } //返回vector的最后一个元素
    const_reference back() const { return *(end() - 1); }
    void push_back(const T& x) {   //vector的push_back,最常用的函数,想vector的末尾增加值
    if (finish != end_of_storage) {
        *finish = x;
        ++finish;
    } else
        insert_aux(end(), x); //如果vector容量已满,进行插入。
    }
    void swap(vector<T /*, Alloc*/>& x) { //交换两个vector的值.这个是很有效率的。常量时间交换。
    ::swap(start, x.start);
    ::swap(finish, x.finish);
    ::swap(end_of_storage, x.end_of_storage);
    }

   
    iterator insert(iterator position, const T& x) { //vector的插入函数
    size_type n = position - begin();
    if (finish != end_of_storage && position == end()) {
        *finish = *position;
        ++finish;
    } else
        insert_aux(position, x); //vector的插入需要拷贝调整元素的位置,因而需要拷贝,效率低
    return begin() + n;
    }
    iterator insert(iterator position) { return insert(position, T()); }
    void insert (iterator position, const_iterator first,
         const_iterator last);
    void insert (iterator position, size_type n, const T& x);
    void pop_back() {  弹出最后一个元素
        --finish;           
        destroy(finish);
    }
    void erase(iterator position) { //删除vector的元素,删除最后一个值是常量时间,否则需要调整元素,重新拷贝,效率很低
    if (position + 1 != end())
        copy(position + 1, end(), position);
    --finish;
    destroy(finish);
    }
    void erase(iterator first, iterator last) {
    vector<T /*, Alloc*/>::iterator i = copy(last, end(), first); //需要重新拷贝
    destroy(i, finish); //删除需要删除的位置
    finish = finish - (last - first);
    }
    void resize(size_type new_size, const T& x) { //调整vector的长度
      if (new_size < size())
        erase(begin() + new_size, end());
      else
        insert(end(), new_size - size(), x);
    }
    void resize(size_type new_size) { resize(new_size, T()); }
    void clear() { erase(begin(), end()); } //清除vector的所有元素,实现保证这个是线性时间的,O(n).

 }

 

vector的常用接口就说到这里了,大家可以仔细体会。

更多的代码,请到www.sgi.com/stl .

 

你可能感兴趣的:(C++,vector,iterator,insert,reference,distance)