2021年7月28日

摘要: 记住前三个: 线性探测 使用hash函数计算出的位置如果已经有元素占用了,则向后依次寻找,找到表尾则回到表头,直到找 到一个空位 开链 每个表格维护一个list,如果hash函数计算出的格子相同,则按顺序存在这个list中 再散列 发生冲突时使用另一种hash函数再计算一个地址,直到不冲突 二次探测 阅读全文
posted @ 2021-07-28 22:52 超人不会灰啊 阅读(112) 评论(0) 推荐(0) 编辑
 
摘要: map支持键值的自动排序,底层机制是红黑树,红黑树的查询和维护时间复杂度均为$O(logn)$,但是空间占用比较大,因为每个节点要保持父节点、孩子节点及颜色的信息 unordered_map是C++ 11新添加的容器,底层机制是哈希表,通过hash函数计算元素位置,其查询时间复杂度为O(1),维护时 阅读全文
posted @ 2021-07-28 22:50 超人不会灰啊 阅读(561) 评论(0) 推荐(0) 编辑
 
摘要: set只提供一种数据类型的接口,但是会将这一个元素分配到key和value上,而且它的compare_function用 的是 identity()函数,这个函数是输入什么输出什么,这样就实现了set机制,set的key和value其实是一样 的了。其实他保存的是两份元素,而不是只保存一份元素 ma 阅读全文
posted @ 2021-07-28 22:48 超人不会灰啊 阅读(259) 评论(0) 推荐(0) 编辑
 
摘要: map的特性是所有元素会根据键值进行自动排序。map中所有的元素都是pair,拥有键值(key)和实值 (value)两个部分,并且不允许元素有相同的key 一旦map的key确定了,那么是无法修改的,但是可以修改这个key对应的value,因此map的迭代器既不 是constant iterato 阅读全文
posted @ 2021-07-28 22:43 超人不会灰啊 阅读(457) 评论(0) 推荐(0) 编辑
 
摘要: STL中的容器可分为序列式容器(sequence)和关联式容器(associative),set属于关联式容器。 set的特性是,所有元素都会根据元素的值自动被排序(默认升序),set元素的键值就是实值,实值就是 键值,set不允许有两个相同的键值 set不允许迭代器修改元素的值,其迭代器是一种co 阅读全文
posted @ 2021-07-28 22:28 超人不会灰啊 阅读(150) 评论(0) 推荐(0) 编辑
 
摘要: priority_queue,优先队列,是一个拥有权值观念的queue,它跟queue一样是顶部入口,底部出口,在插 入元素时,元素并非按照插入次序排列,它会自动根据权值(通常是元素的实值)排列,权值最高,排 在最前面,如下图所示。 默认情况下,priority_queue使用一个max-heap完 阅读全文
posted @ 2021-07-28 22:20 超人不会灰啊 阅读(89) 评论(0) 推荐(0) 编辑
 
摘要: heap(堆)并不是STL的容器组件,是priority queue(优先队列)的底层实现机制,因为binary max heap(大根堆)总是最大值位于堆的根部,优先级最高。 binary heap本质是一种complete binary tree(完全二叉树),整棵binary tree除了最底 阅读全文
posted @ 2021-07-28 22:05 超人不会灰啊 阅读(96) 评论(0) 推荐(0) 编辑
 
摘要: stack stack(栈)是一种先进后出(First In Last Out)的数据结构,只有一个入口和出口,那就是栈顶,除了 获取栈顶元素外,没有其他方法可以获取到内部的其他元素,其结构图如下: stack这种单向开口的数据结构很容易由双向开口的deque和list形成,只需要根据stack的性 阅读全文
posted @ 2021-07-28 21:40 超人不会灰啊 阅读(88) 评论(0) 推荐(0) 编辑
 
摘要: vector是单向开口(尾部)的连续线性空间,deque则是一种双向开口的连续线性空间,虽然vector也可 以在头尾进行元素操作,但是其头部操作的效率十分低下(主要是涉及到整体的移动) deque和vector的最大差异一个是deque运行在常数时间内对头端进行元素操作,二是deque没有容量的概 阅读全文
posted @ 2021-07-28 21:28 超人不会灰啊 阅读(107) 评论(0) 推荐(0) 编辑
 
摘要: 相比于vector的连续线型空间,list显得复杂许多,但是它的好处在于插入或删除都只作用于一个元素空 间,因此list对空间的运用是十分精准的,对任何位置元素的插入和删除都是常数时间。list不能保证节 点在存储空间中连续存储,也拥有迭代器,迭代器的“++”、“--”操作对于的是指针的操作,lis 阅读全文
posted @ 2021-07-28 16:27 超人不会灰啊 阅读(60) 评论(0) 推荐(0) 编辑
 
摘要: list是双向链表,而slist(single linked list)是单向链表,它们的主要区别在于:前者的迭代器是双向的 Bidirectional iterator,后者的迭代器属于单向的Forward iterator。虽然slist的很多功能不如list灵活,但是 其所耗用的空间更小,操作 阅读全文
posted @ 2021-07-28 16:09 超人不会灰啊 阅读(85) 评论(0) 推荐(0) 编辑
 
摘要: vector是一种序列式容器,其数据安排以及操作方式与array非常类似,两者的唯一差别就是对于空间运 用的灵活性,众所周知,array占用的是静态空间,一旦配置了就不可以改变大小,如果遇到空间不足的 情况还要自行创建更大的空间,并手动将数据拷贝到新的空间中,再把原来的空间释放。vector则使用 阅读全文
posted @ 2021-07-28 16:06 超人不会灰啊 阅读(66) 评论(0) 推荐(0) 编辑
 
摘要: 以vector为例: 插入元素: 1、尾后插入:size < capacity时,首迭代器不失效尾迭代失效(未重新分配空间),size == capacity时, 所有迭代器均失效(需要重新分配空间)。 2、中间插入:中间插入:size < capacity时,首迭代器不失效但插入元素之后所有迭代器 阅读全文
posted @ 2021-07-28 16:05 超人不会灰啊 阅读(204) 评论(0) 推荐(0) 编辑
 
摘要: 1) 新增元素:vector通过一个连续的数组存放元素,如果集合已满,在新增数据的时候,就要分配一块 更大的内存,将原来的数据复制过来,释放之前的内存,在插入新增的元素; 2) 对vector的任何操作,一旦引起空间重新配置,指向原vector的所有迭代器就都失效了 ; 3) 初始时刻vector的 阅读全文
posted @ 2021-07-28 15:55 超人不会灰啊 阅读(201) 评论(0) 推荐(0) 编辑
 
摘要: 1) hash table表格内的元素称为桶(bucket),而由桶所链接的元素称为节点(node),其中存入桶元素的容 器为stl本身很重要的一种序列式容器——vector容器。之所以选择vector为存放桶元素的基础容器,主要 是因为vector容器本身具有动态扩容能力,无需人工干预。 2) 向 阅读全文
posted @ 2021-07-28 15:47 超人不会灰啊 阅读(337) 评论(0) 推荐(0) 编辑
 
摘要: 1) 第一级配置器直接使用malloc()、free()和relloc(),第二级配置器视情况采用不同的策略:当配置区块 超过128bytes时,视之为足够大,便调用第一级配置器;当配置器区块小于128bytes时,为了降低额外负 担,使用复杂的内存池整理方式,而不再用一级配置器; 2) 第二级配置 阅读全文
posted @ 2021-07-28 15:43 超人不会灰啊 阅读(134) 评论(0) 推荐(0) 编辑
 
摘要: 1) list不再能够像vector一样以普通指针作为迭代器,因为其节点不保证在存储空间中连续存在; 2) list插入操作和结合才做都不会造成原有的list迭代器失效; 3) list不仅是一个双向链表,而且还是一个环状双向链表,所以它只需要一个指针; 4) list不像vector那样有可能在空 阅读全文
posted @ 2021-07-28 15:40 超人不会灰啊 阅读(703) 评论(0) 推荐(0) 编辑
 
摘要: 1) map的下标运算符[]的作用是:将关键码作为下标去执行查找,并返回对应的值;如果不存在这个关 键码,就将一个具有该关键码和值类型的默认值的项插入这个map。 2) map的find函数:用关键码执行查找,找到了返回该位置的迭代器;如果不存在这个关键码,就返回 尾迭代器。 阅读全文
posted @ 2021-07-28 15:26 超人不会灰啊 阅读(249) 评论(0) 推荐(0) 编辑
 
摘要: 1) 通过下标访问vector中的元素时会做边界检查,确保访问不会出现错误。 2) map的下标运算符[]的作用是:将key作为下标去执行查找,并返回相应的值;如果不存在这个key, 就将一个具有该key和value的某人值插入这个map。 3) erase()函数,只能删除内容,不能改变容量大小; 阅读全文
posted @ 2021-07-28 15:22 超人不会灰啊 阅读(391) 评论(0) 推荐(0) 编辑
 
摘要: 1) unordered_map和map类似,都是存储的key-value的值,可以通过key快速索引到value。不同的是 unordered_map 不会根据key的大小进行排序。 2) 存储时是根据key的hash值判断元素是否相同,即unordered_map内部元素是无序的,而map中的元 阅读全文
posted @ 2021-07-28 14:59 超人不会灰啊 阅读(501) 评论(0) 推荐(0) 编辑