vecotr 一词原来的意思是:矢量,向量,航向,顾名思义指的就是类似于数组的一个存储数据的序列,因此所采用的数据结构非常简单:连续的线性空间,它以两个迭代器 _M_start 和 _M_finish 分别指向配置得来的连续线性空间中目前已被使用的范围,并以迭代器 _M_end_of_storage 指向整块连续空间的尾端:

template <class _Tp, class _Alloc>
class _Vector_base {
public:typedef _Alloc allocator_type;allocator_type get_allocator() const { return allocator_type(); }_Vector_base(const _Alloc&): _M_start(0), _M_finish(0), _M_end_of_storage(0) {}_Vector_base(size_t __n, const _Alloc&): _M_start(0), _M_finish(0), _M_end_of_storage(0) {_M_start = _M_allocate(__n);_M_finish = _M_start;_M_end_of_storage = _M_start + __n;}~_Vector_base() { _M_deallocate(_M_start, _M_end_of_storage - _M_start); }protected:
  _Tp* _M_start;_Tp* _M_finish;_Tp* _M_end_of_storage;};#endif /* __STL_USE_STD_ALLOCATORS */template <class _Tp, class _Alloc = __STL_DEFAULT_ALLOCATOR(_Tp) >
class vector : protected _Vector_base<_Tp, _Alloc>
{
private:typedef _Vector_base<_Tp, _Alloc> _Base;protected:
#ifdef __STL_HAS_NAMESPACESusing _Base::_M_allocate;using _Base::_M_deallocate;using _Base::_M_start;using _Base::_M_finish;using _Base::_M_end_of_storage;
#endif /* __STL_HAS_NAMESPACES */};

  为了降低空间配置时的速度成本,vector 实际配置的大小可能比客户端需求量更大,以备将来可能的扩充,这便是容量(capacity)的概念,当容器满载的时候,整个 vector 就必须另外寻找内存存数据。

  使用_M_start,_M_end,_M_end_of_storage三个迭代器,便能轻易地提供首尾标识、大小、容量、空容器判断,标注运算子、最前端元素值,最后端元素值等功能。

  

template <class _Tp, class _Alloc = __STL_DEFAULT_ALLOCATOR(_Tp) >
class vector : protected _Vector_base<_Tp, _Alloc>
{...
public:iterator begin() { return _M_start; }const_iterator begin() const { return _M_start; }iterator end() { return _M_finish; }const_iterator end() const { return _M_finish; }reverse_iterator rbegin(){ return reverse_iterator(end()); }const_reverse_iterator rbegin() const{ return const_reverse_iterator(end()); }reverse_iterator rend(){ return reverse_iterator(begin()); }const_reverse_iterator rend() const{ return const_reverse_iterator(begin()); }size_type size() const{ return size_type(end() - begin()); }size_type max_size() const{ return size_type(-1) / sizeof(_Tp); }size_type capacity() const{ return size_type(_M_end_of_storage - begin()); }bool empty() const{ return begin() == end(); }reference operator[](size_type __n) { return *(begin() + __n); }const_reference operator[](size_type __n) const { return *(begin() + __n); }
...reference front() { return *begin(); }const_reference front() const { return *begin(); }reference back() { return *(end() - 1); }const_reference back() const { return *(end() - 1); }...
};

  如下为vector示意图:

转载于:https://www.cnblogs.com/Forever-Road/p/6831336.html

STL浅析——序列式容器vector的数据结构相关推荐

  1. 容器大小_C++复习篇(7)序列式容器vector

    点击蓝字 关注我们 主要内容 本篇内容主要介绍STL六大组件之一的序列式容器(vector),容器其实就是各种数据结构:另外,迭代器部分的内容可以看看<STL源码剖析>,它的的主要作用是作 ...

  2. STL源码剖析 序列式容器|Vector

    容器的概观和分类 array 数组 .list 链表.tree树 .stack堆栈.queue队列.hash table散列表.set集合.map映射表 根据数据在容器中的排列顺序,将上述数据结构分为 ...

  3. C++基本序列式容器 vector (一)

    我们以 vector.deque 和 list 为例介绍基本序列式容器,先来看一个关于 vector 容器的例子. #include <iostream> #include <vec ...

  4. c++ 将deque部分元素赋值给vector_《STL源码剖析》学习笔记——序列式容器vector

    目录 1.容器的概观与分类 2.vector概述 2.1 vector 的迭代器 2.2 vector数据结构 2.3 vector构造与内存管理 2.4 vector的元素操作 1.容器的概观与分类 ...

  5. STL之序列式容器(三)、vector容器

    一.vector的使用.创建及初始化 vector<T> 容器是包含 T 类型元素的序列容器,和 array<T,N> 容器相似,不同的是 vector<T> 容器 ...

  6. STL源码剖析 序列式容器 vector 和 ilist

       Vector                 list             单向链表 ilist list的删除操作,也只有指向被删除元素的迭代器会失效,其他迭代器不会受到影响

  7. STL之序列式容器(五)、list容器

    一.list(STL list)使用.创建和初始化 list<T> 容器模板定义在 list 头文件中,是 T 类型对象的双向链表. list 容器具有一些 vector 和 deque ...

  8. C++(STL):25 ---序列式容器stack源码剖析

    一.stack概述 stack是一种先进后出(First In Last Out,FILO)的数据结构.它只有一个出口, 形式如下图所示 特点: stack允许新增元素.移除元素.取得最顶端元素.但除 ...

  9. C++(STL):24 ---序列式容器stack用法

    1.stack的定义 要使用stack,应先添加头文件#include <stack>, 并在头文件下面加上 "using namespace std" //定义 st ...

最新文章

  1. Error: module pages/utils/util is not defined
  2. Java 8 一行代码解决了空指针问题,太厉害了!
  3. word饼图如何画引导线_网络授课如何手写、标注?
  4. CSV格式文件注意细节
  5. GVIM编辑器的配置
  6. Android之使用PopupWindow使用和总结
  7. 炫界 (795) -(脸兵马俑)_秦兵马俑彩绘脱落背后的秘密: 粘合剂竟然是动物胶与蛋类混合...
  8. 模板全特化和偏特化用法
  9. RDLC 报表的制作(图文)
  10. OD调试4----去除NAG窗口的几种方法
  11. Shiro 详细教程(集各教程内容为一体)
  12. PS长图快速切片_PS最常用的100多个快捷键
  13. 软件项目工作量估算方法解析
  14. IDEA 统计Statistic插件下载地址
  15. 白光干涉仪能做什么丨科普篇
  16. ES dense_vector 计算余弦相似度
  17. 对接接口需要注意的事项
  18. android sqlite fts4,SQLite FTS3/FTS4与一些使用心得
  19. 维基解密网站总编辑身世被解密
  20. 1节课学会PS ,Adobe PhotoshopCS6超速入门

热门文章

  1. Linux 文件系统与设备文件系统 (二)—— sysfs 文件系统与Linux设备模型
  2. JS中的array和Object的区别
  3. 使用composer下载依赖包下载失败的解决方法
  4. 为Ubuntu Server 安装图形桌面环境
  5. [react] 你觉得react上手快不快?它有哪些限制?
  6. react学习(18)----vs 全局搜索
  7. 25利他行为可以学习和模仿吗
  8. 前端学习(2776):组件的生命周期和过程
  9. 工作86:防抖和节流的问题
  10. 前端学习(170):无语义元素二