vector是动态空间,随着元素的加入,它的内部机制会自行扩充空间以容纳新的元素。vector的实现技术,关键在于对大小的控制以及重新配置时的数据移动效率。

一、vector的数据结构

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

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

函数

iterator begin(){return start;}
iterator end(){return finish;}
size_type size() const {end() - begin();}
size_type capacity() const() {end_of_storage() - begin();}
bool empty() const {return begin() == end();}
reference operator[](size_type n){return *(begin() + n);}
reference front() {return *begin();};
reference back() {return * (end()-1);}

内存扩充操作

void push_back(const T& x){
  //内存满足条件直接追加元素,否则需要重新分配内存
if (finish != end_of_storage){
construct(finish, x);
++finish;
}
else
insert_aux(end(), x);
} template<class T, class Alloc>
void vector<T,Alloc>::insert_aux(iterator position, const T& x){
if (finish != end_of_storage){
construct(finish, *(finish-1));
++finish; T x_copy = x;
copy_backward(position, finish-2, finish-1);
*position = x_copy;
}
else{ //已无备用空间
const size_type old_size = size();
const size_type len = old_size ? 0 2*old_size : 1;
     //old_size开始为0,分配空间1,old_size不为0,扩充为原来的两倍
    //分配器分配内存
iterator new_start = data_allocator::allocate(len);
iterator new_finish = new_start; //内存拷贝
try{
new_finish = uninitialized_copy(start, position, new_start);
//将原vector内容拷贝到新vector内容
            construct(finish, x);
            ++new_finish;    //调整finish位置

            //插入点后面的元素也要拷贝过来
new_finish = uninitialized_copy(position, finish, new_finish); //拷贝当前后面元素
} catch(...){
destroy(new_start, new_finish);
data_allocator::deallocate(new_start, len);
throw;
} //释放原内存
destroy(begin(), end());
deallocate(); //调整迭代器,指向新vector
start = new_start;
finish = new_finish;
end_of_storage = new_start + len;
}
}

最新文章

  1. C++:为什么说 goto 没有用
  2. 关于Thomas Brinkhoff移动对象生成器的修改
  3. 11月30日《奥威Power-BI智能分析报表制作方法》腾讯课堂开课啦
  4. java 之 file类的一些方法
  5. 如何解决ajax跨域问题(转)
  6. Java语言基本语法
  7. Cocos2d-x——CocosBuilder官方帮助文档翻译2 多分辨率支持
  8. v9站点自定义变量
  9. virtualbox端口转发
  10. spring 内部工作机制(二)
  11. [摘抄]VC6.0移植到VS2008(vs2005)后的错误总结(未全部验证)
  12. CCF系列之相反数(201403-1)
  13. 用redis的订阅发布解决了扫码支付实时响应的问题
  14. 数据挖掘实战&lt;1&gt;:数据质量检查
  15. Nginx如何对日志文件进行配置?
  16. springboot学习二:配置文件配置
  17. Jvm 参数笔记
  18. Oracle ROWNUM用法和分页查询总结
  19. [转]sqlserver2014两台不同服务器上数据库同步
  20. 安装Linux系统的磁盘分区

热门文章

  1. 前端无法渲染CSS文件
  2. NLP之基于Seq2Seq的单词翻译
  3. JAVA系列之JVM内存调优
  4. 五、Python操作redis
  5. 一次 Java log4j2 漏洞导致的生产问题
  6. Day14 note1
  7. 定位java程序中占用cpu最高的线程堆栈信息
  8. jvm调优思路及调优案例
  9. polkit(ploicykit)特权提升漏洞解决方案
  10. Training: ASCII