C++ 头文件系列(unordered_map、unordered_set)
简介
很明显,这两个头文件分别是map、set头文件对应的unordered版本。 所以它们有一个重要的性质就是:
- 乱序
如何乱序
这个unorder暗示着,这两个头文件中类的底层实现----Hash。 也是因为如此,你才可以在声明这些unordered模版类的时候,传入一个自定义的哈希函数,准确的说是哈希函数子(hash function object)。

具有相同相同哈希值的元素被放在同一个桶(bucket)中。
为何乱序
在提供映射、集合功能的情况下,侧重于元素的快速获取。
用树结构(红黑树、二叉搜索树等)实现的map、set,在查找、获取、修改元素的时候,通常需要从根结点自上而下一次遍历树结构,因此时间复杂度为线性 ; 而通过哈希表实现, 只要哈希函数以及桶的大小选取得当,时间复杂度会是常数(只需要调用一次函数,并进行小幅度的查找)。
单向迭代器
哈希表的实现复杂了该容器上的双向遍历,似乎没有一种合适的方法能够做到高效快速。 因此,unorder版本的map和set只提供前向迭代器(非unorder版本提供双向迭代器)。
少了什么函数
- lower_bound
- upper_bound
普通版本的map和set,它们是有序容器,对每一个元素都能都能判断它应该在哪个之前、在哪个之后; 而该版本的容器则不一样,因为它们是乱序的,不能确定每个元素的先后顺序。 因此,容器没有足够的信息来计算这两个边界(然而元素的相等性比较依旧是可行的)。
多了什么函数
出于实现的概念,该版本的类模版必不可少的多了些特殊的函数。
桶相关(Bucket)
- bucket_count : 桶数量。
- max_bucket_count : 最大桶数量。
- bucket_size : 桶大小,即容量。
- bucket : 定位给定元素的桶位置。
哈希策略
- load_factor : 返回load factor,即容器当前元素数量与桶数量之比。
- max_load_factor : 返回或设置最大load factor。
- rehash : 设置桶的数量,并重新对元素进行哈希映射。
- reserve : 请求保留桶的数量至给定值。
注意到,没有函数能改变桶的容量,可能桶也是动态增长的。
Observers
- hash_function : 返回哈希函数(在声明时作为参数传入,或默认的位于funtional头文件中的hash)。
- key_eq : 返回key的相等性谓词,情况与hash_function相似。
C++ 头文件系列(unordered_map、unordered_set)的更多相关文章
- C++ 头文件系列(array)
注意,该头文件仅在C++11中标准才开始出现. 简介 与语言内置的数组一样, array类模版支持几乎所有内置数组包含的特性: 顺序的(sequence) 内存连续的(contiguous stora ...
- C++ 头文件系列(queue)
简介 这个头文件定义了两个跟队列有关的类----quque.priority_queue,分别实现的是队列 和 优先队列这两个概念. 但是与这两个类模版与其它类模版(vector.array等)最大的 ...
- C++ 头文件系列(stack)
简介 该头文件只含有一个类模版stack, 它实现栈的概念,是一个容器适配器(说实话,在写这篇随笔之前我都不知道有这么个类模版). 栈 栈只有一个重要的特性: LIFO(last-in first-o ...
- C++ 头文件系列(vector)
简介 vector头文件包含vector的类模版以及该模版的显示特化版本vector< bool >. vector是C++容器库中非常通用的一种容器,如果你不知道该决定使用哪一种容器,或 ...
- C++ 头文件系列(map)
简介 该头文件包含两个概念相似的容器----map.multimap. 而这两个容器反映的概念就是 映射. 这两个容器 相同 的属性有: 关联性 映射 动态增长 键(Key)唯一性 这两个不相同的属性 ...
- C++ 头文件系列(iterator)
简介 该头文件围绕迭代器展开,定义了一系列与迭代器有关的概念,但最最最重要的一点就是----它和其它容器一起实现了C++容器的Iterator设计模式. Iterators are a general ...
- C++ 头文件系列 (algorithm)
简介 algorithm头文件是C++的标准算法库,它主要应用在容器上. 因为所有的算法都是通过迭代器进行操作的,所以算法的运算实际上是和具体的数据结构相分离的 ,也就是说,具有低耦合性. 因此,任何 ...
- C++ 头文件系列 (bitset)
简介 该头文件有关位集,实际上是vector 位 位本质上对应bool的概念,只有0或1,true或false两种对立的值. 但很可惜,字节才是机器上最小的存储单元,所以bool基本上是由一个字节大小 ...
- C++ 头文件系列(iosfwd)
简介 输入输出历来都是语言的重要部分,在C++中,该库也是占据了相当大的一部分. C++的输入输出库是其遵循面向对象设计的结果,并结合了泛型编程. 以下是这些库类的关系图(箭头标示继承,白框表示摸板, ...
随机推荐
- iOS之UILabel自适应大小
//初始化一个label self.label=[[UILabel alloc] init]; //设置自动行数与字符换行 [self.label setNumberOfLines:0]; //给la ...
- iOS中正则表达式的三种使用方式
1.利用NSPredicate(谓词)匹配 例如匹配有效邮箱: NSString *email = @“nijino_saki@163.com”: NSString *regex = @"[ ...
- linear-gradient线性渐变
作者:zccst CSS3 Gradient 分为 linear-gradient(线性渐变)和 radial-gradient(径向渐变). 1,在mozila background: -moz-l ...
- leetcode--002 rpn
package leetcode; import java.util.Stack; public class RPN { public static int evalRPN(String[] toke ...
- CodeSmith批量生成实体
保存以下文件为ModelBatch.cst <%@ Register Name="Model" Template="D:\Q\web\LHWYVISIT\trunk ...
- DataTable distinct 去重复
有时我们需要从DataTable中抽取Distinct数据,以前总是以对DataTable进行foreach之类纯手工方式获取. 近来发现DataView可以帮我们直接获取Distinct数据,汗一个 ...
- 医院his系统数据库恢复
医院IT系统的重要性堪比金融行业,“银行系统宕机,老百姓不能取钱:医院HIS系统宕机,老百姓不能看病”, 医院信息系统称得上是迄今为止企业级信息系统中最复杂的一类. 某医院HIS系统SQL2008数 ...
- Sublime Text 3 安装 Emmet 插件
首先安装 Package Control 1.通过快捷键 ctrl+` 或者 View > Show Console 菜单打开控制台 2.粘贴以下代码后回车安装 import urllib.r ...
- OS X EI Capitan 10.11 & xcode 7.0 beta(7A120f) -- cocoapods安装失败
1.sudo gem install cocoapods: ERROR:While executing gem ... (Errno:EPERM) Operation not permitted - ...
- IOS 动画的两种方式
方式一: [UIView animateWithDuration:1 animations:^{ //动画的内容 CGRect frame = CGRectMake([UIParam widthScr ...