1、数据泛型 基于封装set和map的经验,我们首先把哈希表中节点的模版参数修改一下,用于存储不同类型的K和pair<K, V>,同时底层的代码也要做相应的修改。 代码语言:javascript 复制 namespace hash_bucket{template<classK>struct HashFunc{size_toperator()(constK&key){return(size_t)key;}};template<>struct ...
//unordered_set类 template<class K> class unordered_set { public: private: HashTable<K, K> _ht; }; 虽然unordered_set看起来传了两个一模一样的参数是无意义的,但是这样就可以实现对哈希表的复用,不用单独为了unordered_set再写一个哈希表了,如下图所示: 插入函数的参数也得从键值对改为任意数据: ...
1. unordered_set是按照 哈希映射 存储元素的容器。 2. 在unordered_set中,元素的value也标识它(value就是key,类型为T),并且每个value必须是唯一的。unordered_set中的元素不能在容器中修改(元素总是const),但是可以从容器中插入或删除它们。 3. unordered_set在底层是用哈希表实现的。 2. unordered_set的接口 ...
unordered_set底层存储数据的内存是从空间配置器申请的,如果需要可以⾃⼰实现内存池,传给第四个参数。 ⼀般情况下,我们都不需要传后三个模板参数 unordered_set底层是⽤哈希桶实现,增删查平均效率是 ,迭代器遍历不再有序,为了跟set区分,所以取名unordered_set。O(1) 前⾯部分我们已经学习了set容器的使⽤...
表1 unordered_set模板类定义 注意,如果 unordered_set 容器中存储的元素为自定义的数据类型,则默认的哈希函数 hash<key> 以及比较函数 equal_to<key> 将不再适用,只能自己设计适用该类型的哈希函数和比较函数,并显式传递给 Hash 参数和 Pred 参数。
unordered_set<int> us1; // 构造一个int类型的空容器us1.insert(3);us1.insert(3);us1.insert(5);us1.insert(1);us1.insert(7);us1.insert(8);for (auto x: us1){cout << x << endl;} 我们使用unordered_set容器 并且插入多组重复数据 之后使用范围for遍历 达到一个去重的效果 ...
关于第四个模板类型存在的理由因为map的数据类型是pair<K,V>,如果里面的key在pair里面,而set的数据类型即使key!但是两者的用法不一样! //在map里面的data类型是pair<K,V>//里面的key是data.first;//在set里面的data的类型是key//里面key就是data;//为了能够让两者的在形式上统一,于是有了KeyofT这个仿函数!
std::unordered_set<Person, hash_fun> myset; 自定义比较规则# 默认情况下无序容器使用的std::equal_to<key>比较规则,其本质也是一个函数对象类,底层实现如下: template<classT>classequal_to{public:booloperator()(constT& _Left,constT& _Right)constreturn(_Left == _Right);}; ...
__unordered_set 构造函数中预设bucket的大小为10。 接下来从hash值计算,hash表扩容与缩容,自定义类型使用 unordered_set 三个方面来剖析 unordered_set。 hash 值的计算 将key 哈希成一个 size_t 类型的变量,然后用它对 bucket 的大小取模算得hash值。 内建数据类型的 hash unordered_set 为内建数据类型提供...