STL hash table, Unordered Contains

STL hash table, Unordered Contain

 

C++11加入使用hash table实现的Unordered Containers。容器中元素是不排序的,同时我们也不能指定某个元素的位置。

头文件:#include <unordered_set>   unordered_set; unordered_multiset;

          #include <unordered_map> unordered_map; unordered_multimap;

操作基本类似于关联容器,只是底层使用hash table。主要不同是理解bucket的概念。

namespace std {

    template <typename T,

                   typaname Hash = hash<T>,

                    typename EqPred = equal_to<T>,

                    typename Allocator = allocator<T> >

    class unordered_set;

    template <typename Key, typename T,

                  typanem Hash = hash<T>,

                  typename EqPred = equal_to<T>,

                  typanema Allocator = allocator<pair<const Key, T> > >

class unordered_ma;
}

注意点:

(1) hash函数为hash<T>

(2) 比较准则 equal_to<T>

1.特点

标准没有指定实现,vs和g++都使用开链法实现。

指定迭代器至少为forward_iterator,但是具体实现一般都是forward_iterator。

插入,删除,查找元素保证分摊的常数时间。rehashing可能发生,这是一个线性复杂度的操作。

相对于普通关联容器的不利:

(1) 不提供<, >, <=,>=去排序元素,since c++11提供了==, !=。

(2)不提供lower_bound(), upper_bound()

(3) 不提供反向迭代器,forward_iterator

(4)不能直接访问元素

(5) 可以通过iterator访问元素,key值是const。

(6) 可以指定min 桶数。

(7) 可以提供自定义的hash function。

(8)可以指定查找元素时的相等准则。重载operator=。

(9) 可以指定max 负载因子,当超过时可以自动重排。

(9) 可以强制rehashing。

rehashing发生的时机:只有在insert(), rehash(), reserve(), clear()之后才可能。

这保证了erase()从来都不会使iterator,reference,和指针失效。

因此,当你删除很多元素是,桶的大小不会改变。但是当你insert()一个元素时,桶的大小可能压缩(rehash)。

相等key是相邻的,rehashing时保证key的相对顺序不变。

2.构造,复制,赋值

unordered c([bnum], [hf], [cmp]);     //桶数目,hash function, 比较谓词都是可选

unordered c(beg, end, [bnum][hf][cmp]);

unordered c = initlist;

unordered c(initlist);

复制和移动复制

c.~Unord();

主要的特点是可以指定:bucket num,hash function, cmp

3.容器内部布局的操作

c.hash_function()

c.key_eq()

c.bucket(val): 返回val所在的桶的索引

c.bucket_count():返回桶的数目,size()返回所有元素的数目。

c.size():返回元素的数目

c.bucket_size(buckidx): 返回桶buckidx的元素数目

c.[c]begin(buckdx):返回桶buckdx的第一个元素forward iter

c.[c]end(buckdx):返回桶buckdx的最后一个元素之后位置

c.max_bucket_count(): 最大桶的数目

c.load_factor():返回当前的负载因子,0.7..0.8之间速度和内存消耗是最平均的。

c.max_load_factor:返回当前最大负载因此,<=1。

c.max_load_factor(val):设置最大负载因子为val,当当前的负载因子 > val时rehashing。若是比较关心速度,可以设置这个。

c.rehashi(bnum); 再散列容器,桶的大小至少为bnum。但是还要考虑到此时的负载因子, 可以存的元素数量为 load_factor * bunm <= bnum; 当前元素数量可能大于此值,可能会进一步的再散列。

c.reserve(num);再散列容器,元素数量至少为num。已考虑了负载因子,能够至少存num个元素而不会再散列。桶的数量为num / load_factor。保证可以存下num元素而不会再散列。

4. 定义自己的hash function

hash function映射元素的值到一个指定的桶,自定义hash function只需映射不同元素值相等的分布在[0, size_t)。

#include <functional>

class  customer

{

     …
}

class CustomerHash

{

      public:

            std::size_t operator() (const Customer &c) const

           {

                     return…
           }

}

std::unordered_set<Customer, CustomerHash> custset;

也可以使用函数:

std::size_t customer_hash_func(const Customer &c)

{

     return …
}

std::unordered_set<Customer, std:size_t(*)(const Customer&)>

custset(20, customer_hash_func);

对于hash_val的选择:

可以使用boost的hash_combine()。

5.定义自己的Equivalence Criterion

可以作为我们查找值的相等准则,默认使用equal_to()使用operator==比较元素。

可以使用普通函数或者函数对象。

注意:带着非默认相等谓词的unordered 容器通常也需要一个非默认的hash function。

6. 查找

主要在快速查找时用

c.count(val);

c.find(val);

c.equal_range(val);

 

STL hash table, Unordered Contains,布布扣,bubuko.com

时间: 2024-07-29 11:41:12

STL hash table, Unordered Contains的相关文章

stl源码分析之hash table

本文主要分析g++ stl中哈希表的实现方法.stl中,除了以红黑树为底层存储结构的map和set,还有用哈希表实现的hash_map和hash_set.map和set的查询时间是对数级的,而hash_map和hash_set更快,可以达到常数级,不过哈希表需要更多内存空间,属于以空间换时间的用法,而且选择一个好的哈希函数也不那么容易. 一. 哈希表基本概念 哈希表,又名散列表,是根据关键字直接访问内存的数据结构.通过哈希函数,将键值映射转换成数组中的位置,就可以在O(1)的时间内访问到数据.举

[CareerCup] 13.2 Compare Hash Table and STL Map 比较哈希表和Map

13.2 Compare and contrast a hash table and an STL map. How is a hash table implemented? If the number of inputs is small, which data structure options can be used instead of a hash table? 这道题让我们比较哈希表和STL中的map数据结构,在遇到这道题之前,我一直以为map就是c++中的哈希表呢,原来是不同的啊-

用c++封装一个Hash Table,并与STL map 进行操作性能上的比较

问题描述: 1.在计算机科学中,hash table 是一种常用的数据结构,它本质上是一种关联容器,它映射一个key 到value.它通过一个hash function把key映射成一个整数值,这个整数值对应存放value值的容器的下标. 2.它主要支持三种操作:插入key,value对(insert),查询(search)给定key, 删除key, value对(delete); 3.它三种操作的平均时间复杂度为O(1),最糟糕情况下的时间复杂度为O(n): 4.hash table要处理核心

几种常见 容器 比较和分析 hashmap, map, vector, list ...hash table

转自:http://www.haogongju.net/art/1543058 list支持快速的插入和删除,但是查找费时; vector支持快速的查找,但是插入费时. map查找的时间复杂度是对数的,这几乎是最快的,hash也是对数的. 如果我自己写,我也会用二叉检索树,它在大部分情况下可以保证对数复杂度,最坏情况是常数复杂度,而std::map在任何情况下都可以保证对数复杂度,原因是它保证存诸结构是完全二叉检索树,但这会在存诸上牺牲一些时间. STL   中的   map   内部是平衡二叉

算法导论---------------散列表(hash table)

摘要: 本章介绍了散列表(hash table)的概念.散列函数的设计及散列冲突的处理.散列表类似与字典的目录,查找的元素都有一个key与之对应,在实践当中,散列技术的效率是很高的,合理的设计散函数和冲突处理方法,可以使得在散列表中查找一个元素的期望时间为O(1).散列表是普通数组概念的推广,在散列表中,不是直接把关键字用作数组下标,而是根据关键字通过散列函数计算出来的.书中介绍散列表非常注重推理和证明,看的时候迷迷糊糊的,再次证明了数学真的很重要.在STL中map容器的功能就是散列表的功能,但

PHP内核探索之变量(3)- hash table

在PHP中,除了zval, 另一个比较重要的数据结构非hash table莫属,例如我们最常见的数组,在底层便是hash table.除了数组,在线程安全(TSRM).GC.资源管理.Global变量.ini配置管理中,几乎都有Hash table的踪迹(上一次我们也提到,符号表也是使用Hash table实现的).那么,在PHP中,这种数据有什么特殊之处,结构是怎么实现的? 带着这些问题,我们开始本次的内核探索之旅. 本文主要内容: Hash table的基本介绍 PHP底层Hash tabl

C++ STL/BOOST--hash table

哈希表(hash table): 图书馆(图书分类): -->A-1-->A-2-->A-3-->A-4 -->B-1-->B-2-->B-3-->B-4 -->C-1-->C-2-->C-3-->C-4 -- 医院(病例分类): -->A-1-->A-2-->A-3-->A-4 -->B-1-->B-2-->B-3-->B-4 -->C-1-->C-2-->C-3--

【string】hash table, two pointers, string

利用hash table, two pointers, string的题目. 1.求最长不重复子串的长度 hash table体现在一个数组,下标是字符串中元素的ASCII值,下标对应的元素代表该元素在字符串中出现的位置. two pointers体现在用i一步步向前移去遍历字符串中的元素,作为不重复子串的末尾位置:用j指向不重复字符区间的首字符的位置. 1 /*************************** 2 @date 4.23 3 @description https://leet

算法导论-散列表(Hash Table)

目录 引言 直接寻址 散列寻址 散列函数 除法散列 乘法散列 全域散列 完全散列 碰撞处理方法 链表法 开放寻址法 线性探查 二次探查 双重散列 随机散列 再散列问题 完整源码(C++) 参考资料 内容 1.引言 如果想在一个n个元素的列表中,查询元素x是否存在于列表中,首先想到的就是从头到尾遍历一遍列表,逐个进行比较,这种方法效率是Θ(n):当然,如果列表是已经排好序的话,可以采用二分查找算法进行查找,这时效率提升到Θ(logn);  本文中,我们介绍散列表(HashTable),能使查找效率