STL浅析——序列式容器vector的数据结构

  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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/416753.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

“约见”面试官系列之常见面试题之第一百零一篇之vue-router传参(建议收藏)

vue-router传递参数分为两大类 编程式的导航 router.push声明式的导航 <router-link> 编程式的导航 router.push 编程式导航传递参数有两种类型&#xff1a;字符串、对象。 字符串 字符串的方式是直接将路由地址以字符串的方式来跳转&#xff0c;这种方式很简单但是不…

“约见”面试官系列之常见面试题之第一百零二篇之vue-router的两种模式(建议收藏)

众所周知&#xff0c;vue-router有两种模式&#xff0c;hash模式和history模式&#xff0c;这里来谈谈两者的区别。 hash模式 hash模式背后的原理是onhashchange事件,可以在window对象上监听这个事件: 上面的代码可以通过改变hash来改变页面字体颜色&#xff0c;虽然没什么用…

olive videoeditor开源跨平台视频编辑器

目录 简介 官网 使用 简介 olive是开源的视频编辑软件&#xff0c;目前下载版本为Alpha版&#xff0c;但已基本可用。 本文讲解添加图片、特效及文字&#xff0c;最后导出视频的简单过程。 官网 Olive - Professional Open-Source Video Editor 下载地址 Olive - Profes…

Centos7.5 Ambari2.7.4部署

目录 1.简介 2.环境准备 3.SSH 免密码登录 4.服务环境 5.本地源搭建 6.安装 7.启动 8.Web页面部署服务 1.简介 本文介绍了Ambari2.7.4在CentOS7.5中使用本地镜像方式进行加速部署。 Ambari Apache Ambari是一种基于Web的工具&#xff0c;支持Apache Hadoop集群的供应…

“约见”面试官系列之常见面试题之第一百零五篇之v-if与v-show(建议收藏)

相同点&#xff1a;v-if与v-show都可以动态控制dom元素显示隐藏 不同点&#xff1a;v-if显示隐藏是将dom元素整个添加或删除&#xff0c;而v-show隐藏则是为该元素添加css--display:none&#xff0c;dom元素还在。 都修改为false后&#xff0c;第一个div是直接被移除掉了 需要…

Apache Nifi 入门与进阶 GitChat连接

NiFi 是美国国家安全局开发并使用了 8 年的可视化数据集成产品&#xff0c;2014 年 NAS 将其贡献给了 Apache 社区&#xff0c;2015 年成为 Apache 顶级项目。 大数据平台都需要进行数据流转&#xff0c;Apache Nifi 作为一款强大的数据流开源软件&#xff0c;支持大量的输入输…

“约见”面试官系列之常见面试题之第一百零六篇之css只在当前组件中起作用(建议收藏)

方法很简单&#xff0c;在组件中的style前面加上scoped就可以了&#xff0c;示例&#xff1a;

html中a标签如何设置行宽高

方法一&#xff1a;float&#xff0c;对a样式盒子float:left让它成浮动 直接演示一下了(实现下面页面) 代码如下 <style>#page{width:120px; /* 在外面画一个区域 */height:700px;}li{list-style:none;}a{text-decoration:none; …

jmeter监控服务资源

转&#xff1a;http://www.cnblogs.com/chengtch/p/6079262.html 1、下载需要的jmeter插件 如图上面两个是jmeter插件&#xff0c;可以再下面的链接中下载&#xff1a; https://jmeter-plugins.org/downloads/old 第三个是放在服务器中的&#xff0c;可在下面的度盘中下载&…

RANSAC算法在图像拼接上的应用的实现

关于算法原理请参考《基于SURF特征的图像与视频拼接技术的研究》。一、问题提出RANSAC的算法原理并不复杂&#xff0c;比较复杂的地方在于“建立模型”和“评价模型”。我们经常看到的是采用“直线”或者“圆”作为基本模型进行“建立”&#xff0c;而采用所有点到该“直线”或…

ajax 接收json数据的进一步了解

var url "../searchclasses";$.ajax({url: url,type: "post",dataType: "json",//以json形式接收error: function() {alert("error");},success: function(data) {var html "";$.each(data, function(index, content) {va…

Spark在Ambari集群环境的使用

进入安装sparkclient的节点 hdfs准备一个文件 su - hdfs vi text.txt 随便写几行东西 #创建目录 hdfs dfs -mkdir /user/hdfs/test #上传文件 hdfs dfs -put test.txt /user/hdfs/test/ #检查文件是否在 hdfs dfs -ls /user/hdfs/test/ #检查内容是否对 hdfs dfs -c…

Spark实战之读写HBase

1 配置 1.1 开发环境&#xff1a; HBase&#xff1a;hbase-1.0.0-cdh5.4.5.tar.gzHadoop&#xff1a;hadoop-2.6.0-cdh5.4.5.tar.gzZooKeeper&#xff1a;zookeeper-3.4.5-cdh5.4.5.tar.gzSpark&#xff1a;spark-2.1.0-bin-hadoop2.61.2 Spark的配置 Jar包&#xff1a;需要HBa…

vitualbox命令操作VBoxManage

进入本地virtualbox管理 运行服务器上的virtualbox 本地直接启动了virtualbox界面 这个很牛啊&#xff0c;直接本地图形化管理了&#xff0c;不用纠结服务器端没有显卡&#xff0c;进不去图形界面的问题了。 研究了VBoxManage startvm 最后才发现可能这样也行&#xff0c;哈…

Hadoop2之NameNode HA详解

在Hadoop1中NameNode存在一个单点故障问题&#xff0c;如果NameNode所在的机器发生故障&#xff0c;整个集群就将不可用(Hadoop1中虽然有个SecorndaryNameNode&#xff0c;但是它并不是NameNode的备份&#xff0c;它只是NameNode的一个助理&#xff0c;协助NameNode工作&#x…

Apache Nifi 实战:多表导入实现及填坑 GitChat连接

NiFi 是美国国家安全局开发并使用了 8 年的可视化数据集成产品&#xff0c;2014 年 NAS 将其贡献给了 Apache 社区&#xff0c;2015 年成为 Apache 顶级项目。 大数据平台都需要进行数据流转&#xff0c;Apache Nifi 作为一款强大的数据流开源软件&#xff0c;支持大量的输入输…

快速入门系列之 Scala 语言 GitChat连接

Scala 是一门多范式的编程语言&#xff0c;设计初衷是要集成面向对象编程和函数式编程的各种特性。目前常应用于 Spark、后端开发等&#xff0c;Twitter 等公司也选择其作为后端语言。 本文以实例为导向&#xff0c;讲解 Scala 这门语言&#xff0c;适合有一定其他面向对象语言…

快速入门系列之 Rust 语言 GitChat连接

Rust 是一枚新星&#xff0c;兼顾开发效率和执行效率的语言。本文以实例为导向&#xff0c;讲解 Rust 这门语言&#xff0c;适合有一定其他面向对象语言基础的人员快速入门。 本文将讲解如下内容&#xff1a; - Hello World 从头起 - 各种类型各种算 - 各式流程来控制 - 数组…