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



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值