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(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(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.釋放舊空間,調整迭代器,水位
void clear():erase(begin(),end()); //使size()==0,capacity()不變
優缺點:可用下標訪問,存取訪問方便快捷;不適用與頻繁的插入,刪除元素,需要移動其以後所有元素,所以vector沒有頭插頭刪操作,效率太慢,但其又適用尾插尾刪(後面沒有元素移動代價)