序列式容器:vector

vector:連續的線性空間,與array唯一的區別在於其空間的動態配置。
其有自己的迭代器,由於它空間連續,所以不論其元素型別爲何,普通指針可以作爲vector的迭代器,如下:
typedef T value_type;
typedef value_type* iterator;
typedef size_t size_type;
typedef value_type& reference;
實現:
  • 私有成員:
iterator start;     //目前使用空間的頭
iterator finish;    //目前使用空間的尾
iterator end _of_storage;    //表示目前可用空間的尾
  • 構造
vector():全0;   //默認
vector(size_type n,const T& value) ;   //初始化n個空間爲value;
vector(size_type n);      //初始化n個空間值爲默認   
  • 基本操作                                                                                                                                                                                                    
begin():return start;
end():return finish;
size():return end()-begin();
capacity():return end_of_storage-begin();
empty():return end()==begin();
ref operator[](n):return (*(begin()+n)); 
front():return *begin();
back():return *(end()-1);
  • 尾插
void push_back(const T& x):
  (1)//若備用空間足夠
     if:finsh!=end_of_storage
     //直接插構造,finish++
  (2)//不足
     else:
     調用insert_aux(iterator position,consy T& x)函數;    
  • insert_aux(iterator position,consy T& x)插入操作:
    (1)//若備用空間足夠
     if:finsh!=end_of_storage
     //直接插構造,finish++
    (2)//不足
     else:
      配置新空間:
      const size_type len=old_size!=0?2*old_size:1;
      new_start=allocate(len);
      //若原大小爲0,則配置1個元素大小;
      //若不爲0,則配置原大小兩倍;
      //將原空間內容拷貝到新空間,並插入新元素;
      //舊空間銷燬釋放,調整迭代器指向新空間,調整水位.
  • 尾刪
void pop_back():--finish,銷燬最後一個元素
  • resize()函數
resize(newsize,value):
    (1)newsize<size:
      調用erase(begin()+newsize,end())  //刪除一段區間
    (2)else
      調用insert(iterator position,size_type n,const T&x )函數;
  • 刪除函數
iterator erase(iterator position):     //刪除指定位置一個,返回此指定刪除位置迭代器
   (1)if不是最後一個元素,將position+1-->finish元素向前移動到position位置;
   (2)  position位置元素被覆蓋刪除;
    (3)--finish,調整finish ;
    (4)銷燬先前最後一個元素,返回position;
//注意:此時position地址沒變,但其指向內容爲被刪除元素的下一個

iterator erase(iterator first,   last);  //刪除一段區間,返回first
   (1)if不是最後一個元素,將last-->finish元素向前移動到first位置;
   (2)區間位置元素被覆蓋刪除;
    (3)將後面last-first元素刪除銷燬;
    (4)finish=finish-(last-first),調整finish ;
    ()返回first.
//注意相同
  • insert函數:
insert(iterator position,size_type n,const T& x);   //指定位置插入n個值爲x的元素
    (1)if(備用空間>=新增插入元素)
        a.插入點之後元素個數>新增元素:
        b.插入點元素之後個數<=新增元素:
    (2)else:備用空間<新增插入元素
        a.決定新長度:舊長度兩倍或新增原素個數(取大的)
          len=old_size+max(old_size,n);
        b.配置新空間:
          將舊空間插入點之前元素複製新空間;
          將新增N個元素插入新空間;
          舊空間插入點之後元素複製到新空間;
        c.釋放舊空間,調整迭代器,水位
  • clear函數
void clear():erase(begin(),end());  //使size()==0,capacity()不變

優缺點:可用下標訪問,存取訪問方便快捷;不適用與頻繁的插入,刪除元素,需要移動其以後所有元素,所以vector沒有頭插頭刪操作,效率太慢,但其又適用尾插尾刪(後面沒有元素移動代價)



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章