哈希表根据元素的值,把他们分布到各个簇中。哈希函数是一种关联函数,她把数据项映射到一个簇中,于是哈希表可以在该簇里进行添加,更新和删除数据的操作。与二叉搜索树一样,哈希表也可以用来实现集合和映射。但与二叉搜索树不同的是,哈希表的迭代器不能按元素的大小顺序访问他们。因此,用哈希表实现的集合与映射是无序的关联容器。
STL中没有哈希表类,也没有提供无序关联容器。
12.1 哈希表
哈希表:表中的每个元素都有唯一的键与之对应。这种关联结构的主要特征是哈希函数,她用键作为参数,并返回表中的某项的入口。可以把哈希表看做是一个有下标索引的数据序列,就像数组和向量一样。哈稀函数是个定位函数,她用键作为参数,返回表中的索引值。哈希的模型就是数组和向量的内存访问函数。哈希函数提供了另外一种不同的访问方式。她不是直接使用索引值,而是根据键求出一个索引,并用该索引来定位表中的某项数据。
12.2设计哈希函数:实际哈希函数不可能达到不产生冲突,应当能够产生均匀分布的哈希值。这样就可以使哈希表的索引散布在表中,从而尽可能的少发生冲突情况。
我们将哈希容器的声明中用到哈希函数,所以必须要有某种机制把哈希函数和容器类联系起来。C++语法允许一个函数把另外一个函数当做参数来用。这种方法效率很低,更好的途径是把函数当成一个函数对象类型的对象来处理。我们把哈希函数定义成函数对象,并扩充模板的语法,使之可以把函数对象类型作为模板参数,就像我们把普通数据类型传递给模板参数一样。
12.2.1 函数对象:
函数对象也就是类的对象,其行为类似于函数。但与普通函数不同的是,象其他类型的对象一样,可以创建,存储和销毁函数对象&