(一)STL体系结构基础介绍
一、STL六大部件
容器(Containers):存放元素,内存由分配器搞定
分配器(Allocator):支持容器的内存分配
算法:操作容器元素的函数。与OO不同(面向对象将元素与函数放到一个类里),GP(模板编程)将数据放入容器,操作方法放入算法中。
迭代器(Iterator): 算法和容器之间的桥梁,通过迭代器,算法才能去操作容器中的元素。迭代器就是泛化的指针。
适配器(Adapters):对其他组件进行转换。
仿函数(Functors):自定义类的相关操作(比如自定义类A,计算其两个实例的相加、相减等,即操作符重载)。
二、一个例子使用六大部件
通常allocator那部分不用写。
三、容器遍历
前闭后开区间
使用auto,for遍历
auto的其他用法
四、容器结构与分析
1、顺序容器
Array:固定大小,连续空间存放
Vector: 当容量不够时,allocator在背后重新分配
Deque: 双端队列
List: 双向链表
ForwardList:单向链表
2、关联容器(包括Unordered_Containers)
关联容器的查找很快
Map/Set:一般用红黑树实现(左右高度平衡的二叉树)
MultiMap/MultiSet: key可重复的。
Map是key-value,Set是key-key。
无序容器:元素存放的位置是不固定的,由hash-table实现(目前最好的实现方式是seperate chaining)。
五、容器使用
1、编码习惯
(1)为每个独立的程序创建namesapce;
(2) 在用到变量时才定义变量,但不缩进;
2、vector
(1)因为单向,只能通过push_back存放元素(从头存放需要移动整个vector);
(2) 当空间不足,重新分配内存时,内存两倍增长;
(3)可以通过front,back访问首尾元素,data访问首地址(vector, array, list);
3、List
标准库有sort,各个容器也有自带sort,排序尽量用自带的sort。每次扩充一个结点,空间利用率高
4、forwad_list
(1)压入元素用的是push_front(其他用的都是push_back);
(2)只有front访问首元素(back,size都不提供);查找较慢。
5、deque
(1)内存分段连续(由buffer构成,每个buffer是连续的),当内存不够时,重新分配一个buffer。
(2)没有自带的sort,只能使用全局的sort
6、stack、queue
内部都是通过deque来实现,一个后进先出,一个先进先出(不提供iterator)。有人也称之为容器的适配器(Adapter)
7、multiset/multimap
(1)通过insert插入元素(会慢一点),有自带的find进行查找(很快)
(2)multimap: c.insert(pair<int, string>(i, buf)),不能使用c[i]来进行插入(key可能重复)
(3)查找时(*item).first为key,second为value
8、unordered_multiset/unordered_multimap
哈希表实现
9、map
可通过m[i]=c来插入,内部会形成pair<>(i, c)来进行插入
七、在双向链表下,使用不同的分配器
直接使用容器(有默认分配器),不要使用分配器分配内存;有小量内存分配需求时,可以使用new/malloc,不要直接使用分配器
八、总结
转载于:https://www.cnblogs.com/573177885qq/p/9933469.html
(一)STL体系结构基础介绍相关推荐
- STL体系结构与内核分析-2-STL体系结构基础介绍(侯捷)--笔记
STL体系结构与内核分析(侯捷) 2.STL体系结构基础介绍 STL设计方式与OO(面向对象)不同的地方,OO鼓励数据和处理数据的方法都放在类里,而STL的数据在容器里,操作数据的方法在其他部件里(模 ...
- [侯捷]C++ STL 体系结构与内核分析--从平地到万丈高楼(数据结构)
01认识headers.版本.重要资源 泛型编程:即使用Template,而STL就是使用了泛型编程 重要资源,编程能用到reference 另一个网站,将STD的内容已经分为了六大类 另一个 p2 ...
- STL vector用法介绍
STL vector用法介绍 介绍 这篇文章的目的是为了介绍std::vector,如何恰当地使用它们的成员函数等操作.本文中还讨论了条件函数和函数指针在迭代算法中使用,如在remove_if()和f ...
- 【华为云技术分享】ARM体系结构基础(1)
鲲鹏处理器采用ARM架构,欧拉系统可以运行在鲲鹏架构的服务器上,想要了解欧拉操作系统对硬件的支持,首先需要了解一些ARM架构的基础知识.操作系统中硬件相关的部分集中体现在汇编指令和对寄存器的操作中,因 ...
- ARMv8体系结构基础05:比较和跳转指令
目录 1 比较与测试指令详解 1.1 CMP指令 1.1.1 概述 1.1.2 指令编码分析 1.2 CMN指令 1.2.1 概述 1.2.2 指令编码分析 1.3 TST指令 1.3.1 概述 1. ...
- arm体系结构与编程_ARM体系结构基础(1)
本文转载自:智能软件研究中心 鲲鹏处理器兼容ARM架构,openEuler操作系统可以运行在鲲鹏架构的服务器上,想要了解openEuler对硬件的支持,首先需要了解一些ARM架构的基础知识.操作系统中 ...
- STM32F4的基础介绍
STM32F4的基础介绍 1. 前言 2. STM32F4总线架构 3. STM32F4时钟系统 3.1 时钟树 3.2 时钟初始化 3.3 时钟使能 参考文献 1. 前言 上周了解了Cortex-M ...
- 【无标题】C#nbsp;语言入门基础介绍学习通http://www.bdgxy.com/
文章来源: 学习通http://www.bdgxy.com/ 普学网http://www.boxinghulanban.cn/ 智学网http://www.jaxp.net/ 表格制作excel教程h ...
- 【2022软件创新实验室暑假集训】Java环境安装与基础介绍
Java环境安装与基础介绍 文章目录 文章目录 Java环境安装与基础介绍 文章目录 Java 简介 主要特性 关于语言学习的选择 Python Java Go&Rust Java环境配置 J ...
最新文章
- XCODE 6.1.1 配置GLFW
- Nature年度十大杰出论文公布:机器狗算法、近室温超导等入选,复旦中科院上榜...
- 作业 3 利用分支和循环结构解决问题
- Java设计模式(二十二):原型设计模式
- 1-spark学习笔记-大数据概述
- 用bit字段来判断性别等
- JavaFX UI控件教程(五)之Radio Button
- 为什么学计算机的学生应该向开源项目做贡献?
- [转自周星星的blog] 解决为什么wcout不能输出中文问题
- LOUVAIN——社交网络挖掘之大规模网络的社区发现算法
- 同构数的算法——C语言
- 网络工程师考试试题讲解视频教程
- wingdings字体符号在哪_wingdings2字体
- LightningChart数据可视化工具图形控件教程47-SurfaceGridSeries3D(曲线网格系列3D)
- 软件测试的发展前景怎么样 做软件测试有前途吗
- 见山只是山 见水只是水——提升对继承的认识
- NotePad++7.5 64 bit版本以后没有plugin manger的解决方法
- 计算机领域会议期刊,数据挖掘等计算机领域顶级会议期刊~(转)
- CentOS7 忘记登陆密码 修改root密码
- 【软件之道】亿图9.3 显示的内容与导出成图片后的内容不一致
热门文章
- java安装好了打不开机_门套安装是45度拼接还是直角好?当初不懂行,没有半年就重装!...
- html5画图论文结束语,基于HTML5 Canvas的画图板的设计与实现.doc
- oracle+包锁源头,oracle琐碎笔记 - 石奈子0314
- oracle函数建立码值,Oracle函数与存储过程
- Java开发中遇到具有挑战的事_170道Java工程师面试题,你敢挑战吗?
- regex match
- Python DButils
- py2neo match
- pandas.Series.quantile
- python大气校正_Python 处理遥感图像:光谱辐射定标、大气校正和计算反射率