vector

vector概述

vector的数据安排以及操作方式与array非常类似,两者唯一的差别在于:
array是静态空间,一旦配置了就不能改变,要更改空间的大小得先配置一块新空间,再将元素一一搬入新空间,再把原来的空间释放给系统。
vector是动态空间,随着元素的加入,它的内部机制会自行扩充空间以容纳新元素。

vector的迭代器

vector维护的是一个连续线性空间,所以不论其元素型别为何,普通指针都可以作为vector的迭代器而满足所有必要条件。

vector的数据结构

vector所采用的数据结构是:线性连续空间。它以两个迭代器start和finish分别指向配置的来的连续空间中目前已被使用的范围,并以迭代器end_of_storage指向整块连续空间(含备用空间的尾端)。
为了降低空间配置的成本,一个vector的容量永远大于或等于其大小,一旦容量等于大小,便是满载,下次再有新增元素,这个那个vector就得另觅居所。

vector的构造与内存管理:constructor,push_back

vector提供许多constructors,其中一个允许我们指定空间大小及初值。
//构造函数,允许指定vector大小n和初值value
vector(size_type n, const T& value){ fill_initialize(n,value);}
//填充并予以初始化
void fill_initialize(size_type n, const T& value){
start = allocate_and_filll(n, value);
finish = start+n;
end_of_storage = finish;
}
//配置而后填充
iterator allocate_and_fill(size_type, const T& x){
iterator result = data_allocator::allocate(n);
uninitialized_fill_n(result, n, x);
return result;
}
当以push_back()将新元素插入vector尾端时,该函数会先检查是否还有备用空间,如果有就直接在备用空间上构造函数,并调整迭代器finish,使vector变大,如果没有备用空间了,就扩充空间(重新配置、移动数据、释放原空间)。
注意:所谓动态增大小,并不是在原空间之后接连续新空间,而是以原大小的两倍另外配置一块较大空间,然后将原内容拷贝过来,然后才开始在原内容之后构造新元素,并释放空间。
因此,vector的任何操作,一旦引起空间重新配置,指向原vector的所有迭代器就都失效了。

vector的元素操作:pop_back, erase,clear,insert

//将尾端元素拿掉,并调整大小
void pop_back(){
–finish;
destroy(finish);
}
//清除(first, last)中的所有元素
iterator erase(iterator first, iterator last){
iterator i = copy(last, finish, first);
destroy(i, finish);
}
//清除某个位置上的元素
iterator erase(iterator position){
if(position + 1 != end()){
copy(position+1, finish, position);
–finish;
destroy(finish);
return position;
}
}
void clear(){
erase(begin(), end());
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值