(一)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,不要直接使用分配器
八、总结
(一)STL体系结构基础介绍的更多相关文章
- STL vector用法介绍
STL vector用法介绍 介绍 这篇文章的目的是为了介绍std::vector,如何恰当地使用它们的成员函数等操作.本文中还讨论了条件函数和函数指针在迭代算法中使用,如在remove_if()和f ...
- SOA体系结构基础培训教程-规范标准篇
引子:本文是<SOA体系结构基础培训教程>第3章<SOA标准与规范>课件,版权所有,转载请注明出处. 随着SOA在业界的应用日益广泛,SOA的标准化问题也成为各界日益关注的焦点 ...
- SOA体系结构基础培训教程
SOA体系结构基础培训教程-规范标准篇 引子:本文是<SOA体系结构基础培训教程>第3章<SOA标准与规范>课件,版权所有,转载请注明出处. 随着SOA在业界的应用日益广泛,S ...
- Web3D编程入门总结——WebGL与Three.js基础介绍
/*在这里对这段时间学习的3D编程知识做个总结,以备再次出发.计划分成“webgl与three.js基础介绍”.“面向对象的基础3D场景框架编写”.“模型导入与简单3D游戏编写”三个部分,其他零散知识 ...
- C++ 迭代器 基础介绍
C++ 迭代器 基础介绍 迭代器提供对一个容器中的对象的访问方法,并且定义了容器中对象的范围.迭代器就如同一个指针.事实上,C++的指针也是一种迭代器.但是,迭代器不仅仅是指针,因此你不能认为他们一定 ...
- TMS320C54x系列DSP的CPU与外设——第2章 TMS320C54x DSP体系结构总体介绍
第2章 TMS320C54x DSP体系结构总体介绍 本章介绍TMS320C54x DSP体系结构的概况,包括中央处理单元(CPU).存在器和片内外设. C54x DSP采用了高级的改进哈佛结构,用8 ...
- Node.js学习笔记(一)基础介绍
什么是Node.js 官网介绍: Node.js® is a JavaScript runtime built on Chrome's V8 JavaScript engine. Node.js us ...
- Node.js 基础介绍
什么是Node.js 官网介绍: Node.js® is a JavaScript runtime built on Chrome's V8 JavaScript engine. Node.js us ...
- 1、git基础介绍及远程/本地仓库、分支
1. Git基础介绍 基于Git进行开发时,首先需要将远程仓库代码clone到本地,即为本地仓库.后续大部分时间都是基于本地仓库上的分支进行编码,最后将本地仓库的代码合入远程仓库. 1.1. 远程仓库 ...
随机推荐
- 使用函数输出水仙花数 (void的用法)
6-11 使用函数输出水仙花数 (20 分) 水仙花数是指一个N位正整数(N≥3),它的每个位上的数字的N次幂之和等于它本身.例如:153=13+53+33. 本题要求编写两个函数, ...
- visual studio属性管理器
位于 视图->其它窗口 项目配置属性,这个项目的属性别的项目也需要的时候可以把属性页复制到新项目. 以及配置单个项目的不同构建方案
- Coursera, Deep Learning 4, Convolutional Neural Networks, week3, Object detection
学习目标 Understand the challenges of Object Localization, Object Detection and Landmark Finding Underst ...
- luogu P4314 CPU监控
传送门 这是个远古巨坑阿qwq 没有历史最大值还是能比较好做的.可能会有一个想法,就是直接维护线段树每个结点出现过的历史最大值,每次最大值变化就更新.但是有个问题:可能一个点能影响历史最大值的标记还没 ...
- Tomcat7基于redis的session共享
一,项目需求 因开发人员在登录后台时需要反复认证,tomcat反复切换,所以给运维组提出需求,解决session共享问题. 二,解决方法 环境:基于Centos6.8 Jdk 版本 java ve ...
- Java -cp 命令行引用多个jar包的简单写法(Windows、Linux
1.Windows下用法 在Windows上,可以使用 用法:java your-jar-lib-folder/* your-main-class your-jar-lib-folder为存放一堆ja ...
- 《从Paxos到Zookeeper:分布式一致性原理与实践》第一章读书笔记
第一章主要介绍了计算机系统从集中式向分布式系统演变过程中面临的挑战,并简要介绍了ACID.CAP和BASE等经典分布式理论,主要包含以下内容: 集中式的特点 分布式的特点 分布式环境的各种问题 ACI ...
- 【tmos】spring data jpa 创建方法名进行简单查询
参考链接 spring data jpa 创建方法名进行简单查询:http://www.cnblogs.com/toSeeMyDream/p/6170790.html
- mysql 原理 ~ LRU 算法与buffer_pool
一 简介:针对查询和事务的页在内存中的处理,是如何进行的 二 LRU算法 普通 : 实现的是末尾淘汰法,当整个链表已满时,淘汰尾部,将新的数据页加入头部 mysql_lru改进 : 分为两部分 yan ...
- gulp3 和 gulp4 区别
运行gulp项目报错:AssertionError: Task function must be specified 今天像往常一样,编写文章,并使用gulp bulid压缩代码,但是一运行:gulp ...