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没有头插头删操作,效率太慢,但其又适用尾插尾删(后面没有元素移动代价)