Hash:确定元素存储位置所用的哈希函数; KeyEqual:判断各个元素是否相等所用的函数; Allocator:指定分配器对象的类型(暂不做了解)。 unordered_set的构造器 示例: voidunordered_set_test1(){ unordered_set<int> us1;// 构造int类型的空容器string str ="hello world";unordered_set<char>us2(str.begin(), st...
今天看到 boost::unordered_map,它与 stl::map的区别就是,stl::map是按照operator<比较判断元素是否相同,以及比较元素的大小,然后选择合适的位置插入到树中。所以,如果对map进行遍历(中序遍历)的话,输出的结果是有序的。顺序就是按照operator< 定义的大小排序。而boost::unordered_map是计算元素的Hash值,根据Hash...
unordered_map和map类似,都是存储的key-value的值,可以通过key快速索引到value。不同的是unordered_map不会根据key的大小进行排序, 存储时是根据key的hash值判断元素是否相同,即unordered_map内部元素是无序的,而map中的元素是按照二叉搜索树存储,进行中序遍历会得到有序遍历。 所以使用时map的key需要定义operator<。...
而Boost::unordered_map则需要键类型提供一个hash_value函数,以及可能需要重载operator==来判断键值是否相等。对于标准库类型,如string,这些函数通常已经定义。但如果键类型是自定义的,那么就需要自行实现这些函数。
(2) 判断两个自定义class类型的变量是否相等的函数,一般在自定义class里重载operator==。 示例代码: #include <iostream> #include <vector> #include <unordered_map> using namespace std; class Myclass { public: int first; vector<int> second; // 重载等号,判断两个Myclass类型的变量是否相等 bool oper...
unordered_map记录元素的hash值,根据hash值判断元素是否相同。map相当于java中的TreeMap,unordered_map相当于 HashMap。⽆论从查找、插⼊上来说,unordered_map的效率都优于hash_map,更优于map;⽽空间复杂度⽅⾯,hash_map最 低,unordered_map次之,map最⼤。 unordered_map与map的对⽐ 存储时是根据key...
1.先用查找函数判断能否找到,若找到了,代表原哈希表里有,直接返回false。 2.用负载因子判断是否需要扩容,需要就进行扩容。 3.通过key和哈希函数,算出哈希地址。 4.哈希地址上有值就往后线性探测。 删除: 因为之前,我们在每个节点上都设置了三种状态:EMPTY,EXIST,DELETE,所以现在删除一个数就非常简单了: ...
bool Insert(const T& data) { KeyOfT kot;//使用类模板,定义一个对象 Hash hs; //1.先找是否已经插入过相同的值 if (Find(kot(data))) return false; //2.判断是否需要扩容 ... //3.通过Hash函数找到插入位置 size_t addr = hs(kot(data)) % _tables.size(); //... } 这样就可以使用类...
同时为了判断什么时候进行哈希表的扩容,在hashTable类中多增加了一个无符号整型的_n变量,表示当前哈希表中存储数据的个数,方便我们用数据个数和vector.size()作除法,看结果是否大于负载因子,如果大于则扩容,如果不大于则继续插入。 enum state{EMPTY,EXIST,DELETE};template <class K, class V>struct HashNode{Hash...
//hash函数key_equal _M_equals; // 判断key是否相等 _ExtractKey _M_get_key; ...