《STL源码剖析》笔记
文章平均质量分 72
随便写的笔记
wasamtc
这个作者很懒,什么都没留下…
展开
-
STL概述
STL概论一.STL简介标准模板库(Standard Template Library,STL)是惠普实验室开发的一系列软件的统称。它是由Alexander Stepanov、Meng Lee和David R Musser在惠普实验室工作时所开发出来的。虽说它主要出现在C++中,但在被引入C++之前该技术就已经存在了很长时间。STL的代码从广义上讲分为三类:algorithm(算法)、container(容器)和iterator(迭代器),几乎所有的代码都采用了模板类和模板函数的方式,这相比于传统的由函原创 2022-03-08 20:03:18 · 887 阅读 · 0 评论 -
空间配置器
空间配置器一.空间配置器概述STL的操作对象都放在容器内,而容器需要一定的配置空间来存放数据资料,而空间配置器就负责给容器分配空间,SGI STL分配的空间是内存(其实基本都是内存吧)。二.空间配置器的标准接口1.必要接口根据容器的需要和STL的规范,一个空间配置器必须有一些必要接口,如值类型,值指针,size_type,rebind,还有一些函数,如分配空间,构造,取地址,获得最大空间等。2.一个简单的空间配置器书中提供了一个很简单的空间配置器,这个空间配置器就提供了rebind,分配空间,原创 2022-03-08 20:03:49 · 880 阅读 · 0 评论 -
迭代器概念与traits编程
迭代器概念与traits编程技法迭代器定义:提供一种方法,使之能够依序巡防某个聚合物(容器)所含的各个元素,而又无需暴露该聚合物的内部表述方式一.迭代器设计思维—STL关键所在STL中心思想在于将容器与算法分开,彼此独立设计然后用迭代器将两者撮合在一起,算法可以通过迭代器访问容器。二.迭代器是一种smart pointer开始先介绍了一个auto_ptr(这个和智能指针好像差不多),auto_ptr可以在离开作用域的时候自动销毁从而避免造成内存泄漏,实现方式就是把指针封装在一个auto_ptr类中原创 2022-03-13 11:07:34 · 914 阅读 · 0 评论 -
序列式容器概述
序列式容器概述一.容器概述及分类容器就是存放东西的地方,而编程中有一些按特定方式排列的数据我们一般叫数据结构,这些数据结构可以配合算法帮助我们解决相关的问题,有一些使用广泛的数据结构如数组,队列,堆栈,树等,而STL中的容器就是存放这些使用广泛的数据结构的。容器又分为序列式容器和关联式容器。二.序列式容器所谓序列式容器,就是其中的元素都可序(但未必有序)。语言本身已有一个array,这里我们还会讨论vector,list,deque,stack,queue,priority-queue等,其中st原创 2022-03-13 16:52:06 · 731 阅读 · 0 评论 -
vector
一.vector概述vector的数据安排及操作方式类似于array,但是array是静态空间,而vector是动态空间,随着元素的加入它的内部会自动扩充空间。vector的实现关键在于对大小的控制和对重新配置时的数据移动效率。二.vector定义摘要这个定义摘要倒没什么好说的,就是把vector定义中一些比较关键的定义展示出来了,本来想写一下这个迭代器的,发现下一节讲的就是迭代器,不过看了这些个定义,还是对vector的使用有很大好处的,至少知道原来那么写那么用的原理的是什么。反正这个是自己看书上原创 2022-03-13 16:52:36 · 1500 阅读 · 0 评论 -
list概述
一.list概述list类似于双向链表,同vector相比,list每次插入或删除元素都分配或释放相应的空间,且元素的插入与删除是常数时间。二.list的结点list本身和list的结点是不同的结构,list的结点有一个前驱指针,一个后驱指针,一个数据域。三.list的迭代器list的迭代器必须自主设计,不能像vector那样用原生指针作为迭代器,因为list的空间并不一定连续。list的迭代器设计并不复杂,差不多就是内部有一个指向node的指针,然后通过操作符重载是整个迭代器具有迭代器的性质(原创 2022-03-15 20:20:25 · 1748 阅读 · 0 评论 -
deque
一.deque概述deque是双向开口的连续线性空间,与vector相比,deque特点主要在于是双向开口,即可以在开头和末尾进行插入删除操作,从技术观点来说vector当然也能实现头端的插入删除,不过vector的插入删除需要移动元素,在头端操作效率太低。deque的第二个特点是它是动态地以分段连续空间组合而成,随时可以增加一段新的空间链接起来,不用像vector那样重新配置。deque实现的复杂度远高于vector,所以各种算法效率更低,有时我们要对deque执行某些算法可以先把deque的内容复制原创 2022-03-17 21:06:16 · 556 阅读 · 0 评论 -
stack、queue
stack一.stack概述stack是一种先进后出的数据结构,只能在一端进行操作,操作包括插入删除,获得最顶端元素。二.stack定义完整列表在以往的容器中,deque是双向开口,只需要封住头端就可以符合stack的定义要求,所以stack往往直接以deque为底层结构,stack也不能叫做容器,叫做容器的配接器,所有操作都是依赖deque完成的。三.小结stack没有迭代器,以往其只允许访问顶端数据,不能进行走访,list也可以作为stack的底层容器(需要显式指定,默认是deque)。s原创 2022-03-18 17:05:04 · 146 阅读 · 0 评论 -
heap、priority_queue
heap一.heap概述heap并不是STL容器组件,那为什么要有它呢,因为随后的priority queue是以heap为底层结构,priority queue就是一个优先队列,即无论按什么样的顺序把任何元素推入优先队列中,取出来的时候一定是先取优先级最大的元素。为了实现这一目标,heap要做的就是把存在其中的元素排好序,如果用list的话排序太慢,如果用binary search tree的话实现太复杂,所以我们这里用complete binary tree,即用二叉完全树作为heap的数据结构,那原创 2022-03-18 17:05:37 · 277 阅读 · 0 评论 -
slist
一.slist概述前面讲过的list是一个环状双向链表,而slist是一个普通的单向链表,slist与list的差别主要在于slist的迭代器是一个Forward Iterator,只能单向移动,由此slist的insert和erase效率都比较低(毕竟没办法往前移动,要找到前一个只有遍历了),所以slist有往后插入和删除的函数,同样的,基于效率考虑,slist没有push_back(要遍历),有push_front,所以进入的次序和实际的排列是反着的(感觉除了节省空间一点,这个slist用处不大啊)。原创 2022-03-18 17:06:11 · 1544 阅读 · 0 评论 -
树及相关介绍
一.树的导览二.二叉搜索树二叉搜索树首先是一棵二叉树,即每个节点只有两个或两个以下的节点数,其次满足二叉搜索树自身的性质:任何节点的键值一定大于其左子树中每一个节点的键值,一定小于其右子树中每一个节点的键值(注意是键值不是实值)。二叉搜索树可提供对数时间的元素插入和访问。元素插入时,从根节点开始比较一直到找到自己合适的位置(新插入的肯定是叶节点),元素删除时,若删除的节点只有一个子节点,则把子节点连到删除节点的父节点即可,若有两个子节点,则把右子树中的最小值(即右子树最左边的叶节点)移到删除节点的原创 2022-03-20 13:51:32 · 465 阅读 · 0 评论 -
RB-tree(红黑树)
一.RB-tree概述红黑树是一种平衡二叉搜索树,其首先必须满足二叉搜索树的条件(注意,不用满足AVL树的条件,即不用满足两个子树高度差不能超过一),然后还要满足下述条件:1.每个节点不是红色就是黑色2.根节点为黑色3.如果节点为红,其子节点必须为黑(父子结点不能同时为红)4.任一节点至NULL(树尾端,无物)的任何路径,所含黑节点数必须相同(为求方便,我们把NULL视为黑节点)根据这些规则,对新插入的结点有两点要求:新节点必须为红(规则4),新节点父节点必须为黑(前面要求和规则3)二.插入原创 2022-03-20 18:37:38 · 1248 阅读 · 0 评论 -
hashtable
hashtable一.hashtable概述hashtable是一种在插入、删除、搜寻等操作上具有常数平均时间的数据结构,原理是hashtable利用散列函数把每一个值映射到另一个值上形成一一对应的关系,类似于索引,所以可以直接查索引。二.解决相同索引使用hashtable有一个不可避免的问题,即不同的元素可能映射到相同的位置,即具有相同的索引。因为元素的数量大于容器的数量这个问题只能尽力避免。解决问题的方法有很多种,如线性探测,二次探测,开链等。线性探测首先认识一个新名词:负载系数:指表中已有原创 2022-05-16 13:36:30 · 751 阅读 · 0 评论 -
set、map
set一.set概述set的特性是set容器中的所有元素都会根据元素的键值自动排序,且set元素的键值就是实值,即只有一种值,set不允许两个元素有相同的键值。因为set中的元素都是严格排好序的,所以不允许使用迭代器对set的元素进行更改,set的迭代器是一种constant iterator(使用红黑树的const_iterator实现),红黑树本身可以排序,且set的操作红黑树都有,所以几乎所有的set操作行为都只是调用红黑树的操作行为。二.set具体实现set的具体实现没什么好说的,都是调用原创 2022-03-22 20:18:20 · 272 阅读 · 0 评论 -
算法概述及基本算法
算法概述及基本算法一.算法概述算法,即解决逻辑或数学问题的步骤,STL中的算法是把常用的可复用的。某些算法要搭配固定的数据结构(如heap的算法,树的算法)。1.算法分析与复杂度表示算法分析即对算法的时间复杂度和空间复杂度分析,一般使用大O表示法,至于对算法复杂度的计算,这个又是另外一个学习的内容了,这里不作描述。2.STL算法总览3.质变算法mutating algorithms——会改变操作对象之值算法操作的区间要么是一个单值,要么是迭代器区间[first,last)所指向的区间,原创 2022-05-16 13:37:35 · 914 阅读 · 0 评论 -
STL其他算法
其他算法一.单纯的数据处理这一小节所列的算法都是很简单的关于数据的算法,都是对数据做一些基本的操作。adjacent_find(查找相邻而重复的元素)算法找出第一组满足条件(相等或自设条件)的相邻元素。count(计数)将迭代器所指区间的每一个元素拿来和指定值比较并计数。count_if(在特定条件下计数)提供一个条件进行计数。find(循序查找)循序查找到第一个符合条件的元素位置。find_if(循序查找符合特定条件者)提供一个特定条件,循序找到第一个符合的元素位置。find_e原创 2022-05-16 13:38:15 · 183 阅读 · 0 评论 -
STL仿函数
仿函数一.仿函数概论仿函数,现在又叫函数对象,从字面意思来说,就是模仿的函数或者有函数功能的对象。为什么需要仿函数呢,从前面各种算法也可以看出来时常需要自行传递函数,按理来说其实函数指针也够用了,但是函数指针不够抽象,也不能和配接器搭配,所以使用仿函数。仿函数的实现是创建一个类,类中有重载()的函数,使用的时候是先创建一个对象,然后用这个对象就可以作为函数使用了(或者用()创建一个临时对象当作函数也行)。STL的仿函数可以按操作数分的话可分为一元、二元仿函数,若按功能分的话可分为算法运算,关系运算原创 2022-05-16 13:38:41 · 657 阅读 · 0 评论 -
STL配接器
配接器一.配接器概论配接器是什么,按正规的定义来说,就是将一个class的接口转换为另一个class的接口,使原本因接口不兼容而不能合作的classes可以一起运作,通俗的说,就是转换接口来适配其他调用者,例如把需要两个参数的转换成一个参数的就行。配接器补充定义:修饰某种事物的接口成为另一种接口以呈现出不同的事物。二.配接器分类有function adapter(仿函数配接器),container adapter(容器配接器),iterator adapter(迭代器配接器)。1.contain原创 2022-05-16 13:39:12 · 330 阅读 · 0 评论