vector容器的底层实现基于数组,里面封装了大量高效的方法,可以完美取代掉数组。整个容器的核心实际上就是动态分配内存,也是其性能优于数组的重要原因。下面重点解析它的核心函数push_back函数:

当数组中增加一个元素x的时候,先判断是否还有备用空间;如果还有备用空间,则将当前指针的值设为x,并将当前的指针加1;若备用空间已经用完,如果之前的空间为0,则重新分配大小为1的空间,否则将空间扩容为之前的两倍,然后将旧容器中的值重新拷贝到新空间中,并重新分配起始指针和当前指针。所以使用vector需要注意的一点就是尽量不要动态给它分配空间。而且空间重新分配之后,之前的所有指针都会失效(特别要注意)

vector扩容机制取决于编译器类型:VS2015-----1.5倍扩容;g++编译器-------2倍扩容

具体实现:

void push_back(const T& x) {if (finish != end_of_storage) { //若当前还有备用空间construct(finish, x); //将当前水位的值设为x++finish; //提升水位}elseinsert_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; //将当前数组的容量扩大为原来的两倍iterator new_start = data_allocator::allocate(len); //重新分配新数组的起始迭代器iterator new_finish = new_start;__STL_TRY {new_finish = uninitialized_copy(start, position, new_start); //将旧数组的值重新分配给当前的新数组construct(new_finish, x); //将当前数组的水位的值设为x++new_finish; //提升新数组的水位new_finish = uninitialized_copy(position, finish, new_finish); //这语句感觉可有可无,因为它根本就不会执行,position即last,而finish也是last}#       ifdef  __STL_USE_EXCEPTIONS catch(...) { //如果重新构造的新数组出现异常,则销毁当前新创建的数组,并释放内存空间destroy(new_start, new_finish); data_allocator::deallocate(new_start, len);throw;}
#       endif /* __STL_USE_EXCEPTIONS */destroy(begin(), end()); //将旧数组的空间释放掉deallocate();start = new_start; //new_start记录新数组的起始位置finish = new_finish; //重新设置当前水位的指针end_of_storage = new_start + len; //设置新数组的容量}
}

[1]《STL源码分析》----侯捷

[2]《STL3.0源码》

vector容器的动态分配空间相关推荐

  1. STL vector 容器介绍

    介绍 这篇文章的目的是为了介绍std::vector,如何恰当地使用它们的成员函数等操作.本文中还讨论了条件函数和函数指针在迭代算法中使用,如在remove_if()和for_each()中的使用.通 ...

  2. STL vector容器

    介绍  这篇文章的目的是为了介绍std::vector,如何恰当地使用它们的成员函数等操作.本文中还讨论了条件函数和函数指针在迭代算法中使用,如在remove_if()和for_each()中的使用. ...

  3. c++的vector容器

    vector容器概念 vector是表示可变大小数组的序列容器. 就像数组一样,vector也采用的连续存储空间来存储元素.也就是意味着可以采用下标对vector的元素 进行访问,和数组一样高效.但是 ...

  4. C++【vector容器模拟实现函数解析】

    文章目录 vector容器&&模拟实现函数解析 一.vector介绍使用 二.vector 迭代器失效问题 三.vector容器模拟实现及函数解析 3.1vector构造函数指针初始化 ...

  5. C++——vector容器的基本使用和模拟实现

    1.vector的介绍 vector是表示可变大小数组的序列容器. 就像数组一样,vector也采用的连续存储空间来存储元素.也就是意味着可以采用下标对vector的元素 进行访问,和数组一样高效.但 ...

  6. STL vector 容器介绍 (转载)

    STL vector 容器介绍<?xml:namespace prefix = o /> A Presentation of the STL Vector Container (By Ni ...

  7. vector容器 常用函数

    vector的介绍 vector是STL(标准模板库)中最常见的容器,它是一种顺序容器,支持随机访问.可以用sort对其进行排序,底层数据结构是数组,可以随机访问元素. vector是一块连续分配的内 ...

  8. vector容器中erase(删除)的使用

    erase函数可以用于删除vector容器中的一个或者一段元素,在删除一个元素的时候,其参数为指向相应元素的迭代器,而在删除一段元素的时候,参数为指向一段元素的开头的迭代器以及指向结尾元素的下一个元素 ...

  9. vector 容器 动态数组总结

    vector 容器 动态数组总结 二话不说直接上代码 #include <vector> #include <algorithm> #include <iostream& ...

最新文章

  1. cidaemon.exe进程cpu占用率高及关闭cidaemon.exe进程方法
  2. 快速失败(fail-fast)和安全失败(fail-safe)
  3. 每天一道LeetCode-----找到有多少条连续路径的和为给定值,路径不需要从根节点出发到达叶子节点
  4. 大型DCI网络智能运营实践
  5. ⼤规模⽆监督预训练语⾔模型与应⽤(上)
  6. OK6410裸机调试
  7. cv2读取np的矩阵图片,numpy数组clip和astype,查看数据类型array.dtype
  8. 2019牛客多校第四场 I题 后缀自动机_后缀数组_求两个串de公共子串的种类数
  9. android获取ip命令
  10. html css字体最小,网页字体大小的设计技巧
  11. PPT修行之路(一)
  12. java程序模拟红篮球概率事件
  13. 操作系统-进程调度实验报告
  14. Unity Metaverse(四)、接入环信IM SDK 实现用户登录注册
  15. 掌握这些PDF转Word方法,从此你就是大神的存在
  16. 豆瓣FM产品分析 | 纯粹极简的听歌APP
  17. 招生简章 | 欢迎报考中科院空天院网络信息体系技术重点实验室(七室)
  18. ForkLift 3.5.6 远程/本地文件管理利器
  19. ESXI6.7升级到ESXI7.0
  20. 自动对齐插件Alignment

热门文章

  1. 光敏电阻5506主要参数_常用光敏电阻的规格参数
  2. Fritzing软件绘制Arduino面包板接线图传感器模块库文件174
  3. win10无线网卡(该设备无法启动,代码10)
  4. ISTQB基础级考试资料汇总
  5. esclip直接快捷键构造函数_IntelliJ Idea 常用快捷键
  6. DeepMind AI 科学家:2020年NLP和ML领域十大研究进展
  7. 《读九章算术学Python》如何用Python编程实现盈不足术?附图解分析、代码实现和习题解答
  8. ES6 — ES11 新特性一篇通
  9. python 网易云音乐评论爬取3
  10. 苹果召回MacBook Air 内地官网声明用英文遭指责