STL札记2(序列容器vector、list、deque)
2019独角兽企业重金招聘Python工程师标准>>>
序列式容器
容器,置物之所也。
按“数据在容器中排列的特性”,可以将基本的额数据结构类型划分为序列式与关联式。本文就序列式容器进行杂谈。
一、vector
我接触STL,就是从vector开始的,一开始写project只是拿来主义,当时只是知道它可以自动生长空间,(好像知道就这可以了^-^)。但是读完相关书籍后,对vector又有了新的认识,至少对它的构造以及管理更加清晰。
采用半开区间[ )
当然,对于STL的所有容器都是这样。这样方便编程。(深深的体会到细节的美丽,与平时我们所用的“哨兵”异曲同工)
vector维护的是绝对的连续线性内存空间
两个相邻迭代器之间的距离是一个常数。(如同线性空间内指针一样)。
基于vector的适配器heap有些实现细节也得益于其绝对的连续线性内存空间。
vector数据结构
template <class T, class Alloc = alloc>//使用标准的空间配置
class vector{
/*other*/
……
protected:
iterator start; //vector空间头
iterator finish; //目前正在使用的空间尾
iterator end_of_storage; //可用的空间尾
}
假设有vector<int> myVec,已经存储了数据2,4,5。下面看看数据结构内部是什么样的。
看完上图,我相信你已经对vector内部的数据结构有了很深的理解,还有size与capacity是两个不同的概念,判断一个vector是否为空只能用size的原因也就不言而喻。
vector构造与内存管理
配置两倍的请求内存量
进行空间生长时,若原剩余空间量足够容纳再次请求大小,就一次性将数据压入,否则,进行两倍原大小的空间配置,如果此时在生长方向没有连续的可用内存,则会引起空间重新配置。进行移动数据,释放原空间等一系列操作,注意,此时指向原vector的迭代器全部失效,因为此时的空间已经搬新家了。
释放元素时,回收内存,当然不返回给OS,留给自己用。直至生命周期结束。
vector常用操作以及注意事项
push_back:在finish后压入一个元素
pop_back:拿掉尾端元素
erase:清除指定元素
clear:清空vector空间所有元素,此时size()=0,而capacity()!=0
二、list
n list相对于vector就显得节俭多了,对空间的运用绝对的精确,可谓一点也不浪费啊。
n list每配置一个元素或删除一个元素,就会进行空间配置或释放(还给OS了)
n list数据结构
list被设计为双链表结构(故list提供了双向迭代器,具备前移、后移的能力)。节点结构如下:
template<class T>
struct __list_node{
typedef void* void_pointer;
void_pointer prev; /*双链表的前后指针*/
void_pointer next;
T data; //数据
};
list构造与内存管理
再次强调:是绝对的精确,绝对的配置与释放元素所占用的空间。
list常用操作以及注意事项
操作与双链表的操作类似。
push_front,pop_front:头插与头删除
push_back,pop_back:尾插与尾删除
unique:移除数值相同的连续元素。举个列子:假设现在list中的元素为2,3,4,5,5,5,6,7,7,8,9。经过unique操作后,list元素为:2,3,4,5,6,7,8,9
merge:归并排序
splice:接合操作,可以是同一个list内部,也可以是不同list之间。
sort:排序(注意此处使用的不是STL的sort()算法)
clear:清空整个list
三、deque
n deque是一种双向开口的连续线性空间(注意是:伪连续,而是分段线性)
n 对于deque,要理解它的中控器,有如下示意图:
中间的每一个迭代器(除去头和尾)都通过first和last将每一段线性空间给串起来,像串珠子一样,而中控器相当于管理者,他掌握者每一个“珠子”的位置以及使用情况。
了解了STL的序列容器,那么对后面的适配器stack、queue、heap、priority_queue都会很轻松的掌握。
少年,黑暗中继续前行!!
转载于:https://my.oschina.net/stone8oy/blog/284250
STL札记2(序列容器vector、list、deque)相关推荐
- 【STL四】序列容器——vector容器
[STL容器]序列容器--vector容器 一.简介 二.头文件 三.模板类 四.成员函数 1.迭代器 2.元素访问 3.容量 4.修改操作 五.demo 1.容量reserve.capacity.s ...
- C++线性序列容器vector简单总结
C++线性序列容器<vector>简单总结 vector是一个长度可变的数组,使用的时候无须声明上限,随着元素的增加,Vector的长度会自动增加:Vector类提供额外的方法来增加.删除 ...
- 简单实现STL库中的容器vector
一.简要说明 本篇博客实现的容器仅仅可存放任意基本数据类型的元素,但是还没有实现容器可存放容器类型的元素(类似于多维数组). 二.代码实现 2.1 数组声明 #define INCREASEMENT ...
- 【C++ STL学习笔记】C++ STL序列式容器(array,vector,deque,list)
文章目录 C++ STL容器是什么? 迭代器是什么,C++ STL迭代器(iterator)用法详解 迭代器类别 迭代器的定义方式 C++序列式容器(STL序列式容器)是什么 容器中常见的函数成员 C ...
- java中vector容器,vector向量容器(常用的使用方法总结)
关于STL中vector容器的学习,编译运行后边看代码,边看执行结果效果更佳,还是想说看别人的代码一百遍,不如自己动手写一遍. vector向量容器不但能像数组一样对元素进行随机访问,还能随时在尾部插 ...
- C++ STL容器——序列式容器(array、vector、deque、list)
概述 1.C++ STL的容器分为三种,序列式容器,关联式容器,无序式容器,这里先说说常用的序列式容器. 2.array,vector,deque,list,forward_list这几种都是序列式容 ...
- 【C++ STL学习之三】容器deque深入学习
C++ STL容器deque和vector很类似,也是采用动态数组来管理元素. 使用deque之前需包含头文件: #include <deque> 它是定义在命名空间std内的一个clas ...
- 容器大小_C++复习篇(7)序列式容器vector
点击蓝字 关注我们 主要内容 本篇内容主要介绍STL六大组件之一的序列式容器(vector),容器其实就是各种数据结构:另外,迭代器部分的内容可以看看<STL源码剖析>,它的的主要作用是作 ...
- C++ STL常用标准库容器入门(vector,map,set,string,list...)
STL常用标准库容器 C++ STL中最基本以及最常用的类或容器无非就是以下几个: 目录 string vector deque list forward_list queue priority_qu ...
最新文章
- 事务的应用demo1-------采用JDBC硬编码方式模拟银行转账。
- BGP小实验——选路不困难,只要有方法
- 解决《Mobile绘制背景图片》中的问题
- POJ 1797 Heavy Transportation
- 第一个程序03 - 零基础入门学习汇编语言22
- 【数据结构】——构建二叉树,遍历二叉树
- java resultset 映射到实例_Java中,将ResultSet映射为对象和队列及其他辅助函数
- Groovy 入门教程
- IEC60958/61937协议
- Google Earth Engine(GEE)——逐日MOD10A1.005积雪覆盖度500m数据下载和均值标准差统计(中国区域为例)
- 拳皇97用什么计算机语言编写,拳皇97这几个人物非常适合新手,用来打电脑可轻松通关...
- 滴滴裁员2000人:老板辞退你,从来都不是因为钱
- python中and、or、not、in和not in五种运算用法
- 用Excel求线性回归方程
- 计算机word表格计算教程F9,Word表格数据计算与域操作
- 高中教师资格证笔试计算机学科知识与能力,2018下半年教师资格证考试笔试-高中信息技术学科知识与能力试题答案...
- linux进阶之道 pdf,PDF
- oracle下载,windows版本的oracle数据库下载
- Vue项目中background-image属性设置方法
- hg和git命令对照表(值得拥有)
热门文章
- VS2010 php 插件配置
- 关于SQL数据库中的数据到如何导出--SQL2000导入到SQL2008中
- 大数据之-Hadoop3.x_MapReduce_Combiner概述---大数据之hadoop3.x工作笔记0118
- C++_基础部分_C++文件操作_文件的写入操作---C++语言工作笔记076
- AndroidStudio_android中实现图片动态设置图片的位置以及图片动态缩放---Android原生开发工作笔记234
- VC++工作笔记0002---积累-VC++中的L“”是什么意思
- STM32工作笔记0093---DAC数模转换实验-M3
- override(C# 参考)
- java 中生成文档_在Java中生成专业的公文文档
- mysql分句执行_《Mysql 一条 SQL 语句是如何执行的?》