STL 源码学习笔记——vector

Vector结构定义

vector所采用的数据结构非常简单:线性连续空间。它以两个迭代器start和finish分 别 指 向 配 置 得 来 的 连 续 空 间中 目 前 已 被 使 用 的 范 围 , 并 以 迭 代 器end_of_storage指向整块连续空间(含备用空间)的尾端:

template <class T, classAlloc = alloc> 
class vector{ 
... 
protected: 
iterator  start; //表示目前使用空间的头
iterator  finish; //表示目前使用空间的尾
iterator  end_of_storage;//表示目前可用空间的尾
... 
}; 

Vector方法实现

为了降低空间配置时的速度成本,vector实际配置的大小可能比客端需求量更大一些,以备将来可能的扩充。这便是容量(capacity)的观念。换句话说一个 vector 的容量永远大于或等于其大小。一旦容量等于大小,便是满载,下次再有新增元素,整个vector就得另觅居所。
运用start, finish, end_of_storage三个迭代器,便可轻易提供首尾标示、
大小、容量、空容器判断、注标([ ])运算子、最前端元素值、最后端元素值等机能:

template <class T, classAlloc = alloc> 
class vector{ 
... 
public:
vector() : start(0), finish(0), end_of_storage(0) {} 
vector(size_type n, const T& value) {fill_initialize(n, value); } 
vector(int n, const T& value) { fill_initialize(n, value); } 
vector(long n, const T& value) { fill_initialize(n, value); } 
iterator  begin() { return start; } 
iterator  end() { return finish; } 
size_typesize() const { return size_type(end() - begin()); } 
size_typecapacity() const { 
return size_type(end_of_storage - begin()); } 
bool empty() const { return begin() == end(); } 
referenceoperator[](size_type n) { return*(begin() + n); } 
referencefront() { return *begin(); } 
referenceback() { return *(end() - 1); } 
... 
}; 

这里写图片描述

由上可知,一个vector真实空间大小为capacity(),而真实的元素个数为size()。当capacity < size时,vector需要进行扩容。将会经历三个步骤:
1. 调用alloc,分配一个capacity*2的新空间;
2. 将旧的vector上的元素copy到新vector中;
3. 释放原来的vector空间。

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

vector 容器的push_back,pop_back都是操作finish指向的元素,也就是最后一个成员。有点类似于栈的操作形式。

void push_back(const T& x) { 
if (finish != end_of_storage) { //还有备用空间
construct(finish, x); 
++finish; 
} 
else 
//全域函式,见 2.2.3节。
//调整水位高度
//已无备用空间
}

void pop_back() { 
--finish; 
destroy(finish); 
} 

erase(first, last)将会把first到last之间的所有元素删除,并且合并剩余的部分,如下图:

这里写图片描述

insert(position,n,x)
这里写图片描述

这里写图片描述

这里写图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值