文章目录
- array
- 测试array容器
- bsearch之前用qsort 可以极大提高搜索效率
- 测试vector容器
- list容器
- forward_list容器测试
- slist
- deque容器
- stack容器
- quque
- 为什么stack 和 queue这样的容器 没有迭代器的相关内容
- multiset
- 代码里面有使用 stl自带的find 和 容器自带的find 一般容器自带的find 效率更高 stl的find 泛用性更广
- multimap
- unordered_multiset
- unordered_multimap
- set
- map
- hash 容器改名unordered部分
用容器去存储 一百万个随机数 然后查找指定数据 查看其消耗的时间
主要是看性能和常用 api 适合有一定基础来看
array
拥有静态空间的数组 适合快速插入和读取数据
unordered Containers 其实也实算是一种关联式容器
无序关联容器包括unordered_map、unordered_set 和unordered_multimap、unordered_multiset 四种。
Deque 双端队列 可以两端扩充
list 链表 (双向链表)每一个元素是用指针串起来的 而且每个链表节点有两个指针 指着前面和后面(老师提到这个链表其实是环状链表)
forward-list 单向链表
Set/Multiset Map/Multimap 二分数 红黑数 插入和删除元素的过程中 会自动调整成平衡二分数 因为红黑数的性能优秀 所以编译器所带的标准库里面的这部分数据结构都是用红黑树来实现的
无序容器的数据结构 存取都非常方便
测试array容器
这个函数测试array容器了 放入50w个数据 排序数据 并查找相关数据 共需要多少时间
一共用了多少毫秒(187ms)
bsearch之前用qsort 可以极大提高搜索效率
Because this function may be optimized to use a non-linear search algorithm (presumably a binary search), the elements that compare less than key using compar should precede those that compare equal, and these should precede those that compare greater. This requirement is fulfilled by any array ordered with the same criteria used by compar (as if sorted with qsort).
由于此函数可以优化为使用非线性搜索算法(可能是二进制搜索),因此使用 compar 比较小于键的元素应先于比较相等的元素,并且这些元素应先于比较较大的元素。使用与 compar 相同的条件排序的任何数组都满足此要求(就像用 排序 qsort 一样)。
测试vector容器
源代码如下
vector 容器扩容的机制是 空间不够的时候在原来的基础上的两倍 而且只能往后扩展
vector 在扩容的时候 会寻找一片原来空间两倍的空间 会把原来空间里面的东西拷贝到新的空间里面去
list容器
注意:
在C++标准模板库(STL)中,std::list 是一个双向链表容器。这个容器提供了各种成员函数来操作链表中的数据。其中,max_size() 是一个成员函数,它返回 list 容器可能持有的最大元素数。 然而,实际上 max_size() 返回的值通常是一个非常大的数,代表理论上的最大限制,而不是实际机器上可用的内存大小。这是因为 max_size() 返回的值通常是由 size_t 类型能够表示的最大值,而不是由可用内存决定的。 在大多数实现中,max_size() 的返回值是如此之大,以至于在实际使用中几乎不可能达到这个限制,因为这将需要远超过任何实际机器的内存。这个值主要用于理论分析和比较不同容器类型之间的潜在大小差异。 如果你需要检查是否有可能在添加更多元素时耗尽内存,你应该考虑其他方法,比如检查 std::bad_alloc 异常(在尝试分配内存但失败时抛出),或者手动管理你的内存使用。但是,请注意,即使你检查了 max_size() 并确信你有足够的空间,这也不能保证在添加更多元素时不会耗尽内存,因为其他程序或系统进程也可能正在使用内存。 ---
forward_list容器测试
单向链表测试
slist
slist和forword_list基本相同 不同点就在于其所在的库
使用slist需要包含
#include<ext\list>
而使用forward_list则需要包含
#include<forward_list>
deque容器
双端队列容器 具有队列和栈的特性 很强大的数据结构
deque容器其实是一段一段buffer组合而成的,用指针给它串联到一起, 可以同时向两边扩展,从一个指针的buffer末尾跳转到下一个指针的buffer头部 是使用了指针++的操作来实现的
每次扩充一个buffer
使用和上面差不多的测试方法 得到的测试结果如下
stack容器
先进后出的栈式容器
quque
单项队列容器
为什么stack 和 queue这样的容器 没有迭代器的相关内容
因为如果有迭代器 就可以通过迭代器 去修改其中的内容 破坏了 它们独有的特性
multiset
底层是红黑树 红黑树插入元素是insert
插入的位置 不是头也不是尾 而是它本身该出现的位置
关联式容器查找某个值的速度非常快
multiset 表示可以插入重复元素的集合
注意:
代码里面有使用 stl自带的find 和 容器自带的find 一般容器自带的find 效率更高 stl的find 泛用性更广
multimap
map 是key 和 value的一种映射
查找的事件 没有显示出来 用0表示 说明可能是纳秒级别的
插入的key value 所以要用pair来组合一下
去数据的时候 需要用first 和 second 来访问
unordered_multiset
通过上面的结果可以看到 unordered_multiset 其实是用哈希表来存储的
哈希桶的数量要比插入的元素的数量还要多 这样设计居然是合理的
而且每次当哈希里面的元素个数要多余哈希桶的数量的时候 这个哈希桶的数量就要翻倍处理
哈希表上的负载因子(Load Factor)是一个用于衡量散列表(如哈希表)填充程度的参数。它表示哈希表中已存储元素数量与哈希表总容量之间的比率,通常以符号λ表示,计算公式为:λ = (已存储元素数量) / (哈希表总容量)。
负载因子的大小对哈希表的性能有重要影响。当负载因子较小时,哈希表相对空闲,有较多的空闲槽位可供使用,这有助于提高插入和查找操作的性能。然而,这也会浪费一定的内存空间。相反,当负载因子较大时,哈希表的槽位大部分被占用,这可能会导致哈希冲突的增加,进而影响哈希表的性能。
因此,在实际应用中,需要根据具体需求和场景来设置合适的负载因子。通常,负载因子会设置为一个介于0和1之间的值,例如0.7或0.75,以达到性能和空间的平衡。当负载因子超过这个阈值时,哈希表可能会自动扩容,创建两倍于原来个数的箱子,以容纳更多的元素,并降低哈希冲突的概率。这个过程也称为重哈希(rehash)。
总之,哈希表的负载因子是一个重要的参数,它决定了哈希表的填充程度和性能表现。在实际应用中,需要根据具体情况来设置合适的负载因子,以达到最优的性能和空间利用率。
unordered_multimap
set
不可以重复 放入值
可以看到我们插入的值 数量有100w 但是值没有那么多 只有32768个
map
这里面有个元素 插入元素 不能重复
可以通过访问下标直接访问到元素 直接进行插入操作 这里面有个自动生成pair的过程 因为其key是 不同的 所以map的size 还是100w个