STL中vector底层数据结构浅析

vector是一个单口容器,在尾部进行操作

在这里插入图片描述

vector类成员

vector类部分源码如下:

class vector{
    
    
    protected:
        iterator start;//表示目前空间的头
        iterator finish;//表示目前使用空间的尾
        iterator end_of_storage;//表示目前可用空间的尾

    public:
        iterator begin(){
    
    
            return start;
        }
        iterator end(){
    
    
            return finish;
        }
        size_type size() const{
    
    
            return size_type(finish - start);
        }
        size_type capacity() const{
    
    
            return size_type(end_of_storage - start)
        }
        reference operator[](size_type n){
    
    
            return *(start + n);
        }
        reference front(){
    
    
            return *start;
        }
        reference back(){
    
    
            return *(finish - 1);
        }
};

1. push_back

增加新元素时,若超过当时的可用容量,则会将容量扩充至两倍。这里需要注意的是:

  • 动态增加大小,并不是再原来的空间后直接续接空间(因为无法保证原空间后面尚有足够的内容空间)
  • 而是另外申请两倍于当前容量的空间,并将原来的元素拷贝到新的空间,并释放原有空间
  • 因此,一旦vector扩充空间后,指向原vector的迭代器都会失效

源码如下:

void push_back(const T& x){
    
    
    if(finish != end_of_storage){
    
       //还有备用空间
        construct(finish, x);
        finish++;
    }else{
    
                              //已无备用空间
        insert_aux(end(), x);       //容量扩充成原来的2倍
    }
}
2. pop_back

将尾部元素拿掉,并调整大小

void pop_back(){
    
    
	finish--;       //将尾部标记前移一格,表示放弃尾端元素
	destroy(finish);
}
3. erase

清除[first, last)中所有的元素

iterator erase(iterator first, iterator last){
    
    
    iterator iter = copy(last, finish, first);
    destroy(iter, 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;
    }
}

猜你喜欢

转载自blog.csdn.net/qq_42500831/article/details/107565699
今日推荐