STL源码剖析-序列式容器之vector

1.vector概述

vector是动态空间,随着元素的加入,它内部机制会自行扩充空间以容纳新元素.

vector的实现技术,关键在于其对大小的控制及重新配置时的数据移动效率.

2.vector的迭代器

vector的迭代器是普通指针,支持随机存取,提供的是Random Access Iterator.

    template<class T, class Alloc = alloc>  
    class vector{  
    public:  
        typedef T   value_type;  
        typedef value_type* iterator;//vector的迭代器是普通指针  
        ...  
    };  

3.vector的数据结构

vector采用的数据结构是线性连续空间.以两个迭代器start和finish分别指向配置得来的连续空间中目前已经被使用的范围,并以迭代器end_of_storage指向整块连续空间(含备用空间)的尾端.

template<class T,class Alloc = alloc>  
class vector{  
...  
protected :  
    iterator start ; //表示目前使用空间的头  
    iterator finish ; // 表示目前使用空间的尾  
    iterator end_of_storage ; //表示目前可用空间的尾  
};

一个vector的容量永远大于或等于其大小,当容量等于大小时,再增加新元素,便要进行重新配置,移动数据和释放原空间3个过程.

这里写图片描述

4.push_back()函数

    void push_back() {  
        if (finish != end_of_storage) {//还有备用空间  
            construct(finish);  
            ++finish;    //调整迭代器finish  
        }  
        else//没有备用空间  
            insert_aux(end(), x);  
    }  
    template<class T, class Alloc>  
    void vector<T, Alloc>::insert_aux(iterator position, const T&x){  
        if (finish != end_of_storage){//还有备用空间  
            construct(finish, *(finish - 1)); //在备用空间起始处构造一个元素,以vector最后一个元素值为其初值  
            ++finish; //调整finish迭代器  
            T x_copy = x;  
            copy_backward(position, finish - 2, finish - 1);  
            *position = x_copy;  
        }  
        else{//没有备用空间  
            const size_type old_size = size();  
            const size_type new_size = old_size != 0 ? 2 * old_size : 1;  
            iterator new_start = data_allocator::allocate(new_size);  
            iterator new_finish = new_start;  
            try{  
                new_finish = uninitialized_copy(start, position, new_start);//将原vector的内容拷贝到新vector  
                construct(new_finish, x);  
                ++new_finish;  
                new_finish = uninitialzed_copy(position, finish, new_finish);//将安插点的原内容也拷贝过来  
            }  
            catch (excetion e){  
                destroy(new_start, new_finish);//如果发生异常,析构移动的元素,释放新空间  
                data_allocator::deallocate(new_start, new_size);  
            }//析构并释放原空间  
            destroy(begin(), end());  
            deallocator();  
            start = new_start; //调整迭代器  
            finish = new_finish;  
            end_of_storage = new_start + new_size;//调整迭代器  
        }  
    }  

用push_back()函数将新元素插入于vector尾端时,首先检查是否有备用空间,有的话直接在备用空间构造元素并调整迭代器finish,如果没有的话就扩充空间(重新配置,移动数据和释放原空间3个过程),指向原vector的所有迭代器都失效.见图4-2.

5.pop_back()函数

    void pop_back(){  
    --finish;  
    destory(finish);  
    }  

用pop_back()函数将尾元素删除时,首先将迭代器finish前移一格,再用destroy()函数销毁尾元素.

6.erase()函数

    iterator erase(iterator first,iterator last){//清除区间[first,last)的元素  
       iterator  i=copy(last,finish,first);  
       destroy(i,finish);  
    finish=finish-(last-first);  
    return first;  
    }  
    iterator erase(iterator position){ //清除某个位置上的元素  
       if(position +1!=end())   
               copy(position+1,finish,position);   
    --finish;  
    destroy(finish);  
    return position;  
    }  

这里写图片描述

7.insert()函数

这里写图片描述

这里写图片描述

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值