首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何将unordered_set::find与自定义散列函数一起使用

unordered_set是C++标准库中的一个容器,用于存储唯一的元素集合。它基于哈希表实现,因此在查找元素时具有较高的效率。unordered_set::find是unordered_set容器提供的一个成员函数,用于查找指定元素的位置。

当我们需要在unordered_set中使用自定义的散列函数时,需要满足以下要求:

  1. 定义自定义散列函数:自定义散列函数应该接受一个参数,即要进行散列的元素,然后返回一个哈希值。哈希值应该是一个整数,用于确定元素在unordered_set中的位置。自定义散列函数应该尽量将元素均匀地分布在unordered_set中,以提高查找效率。
  2. 重载unordered_set的哈希函数:unordered_set容器提供了一个模板参数,用于指定元素的哈希函数。我们可以通过重载这个哈希函数来使用自定义的散列函数。重载哈希函数时,需要定义一个结构体或类,并重载函数调用运算符operator()。这个函数应该接受一个参数,即要进行散列的元素,然后返回一个哈希值。

下面是一个示例代码,演示如何将unordered_set::find与自定义散列函数一起使用:

代码语言:txt
复制
#include <iostream>
#include <unordered_set>

// 自定义散列函数
struct MyHash {
    std::size_t operator()(const std::string& str) const {
        // 自定义的散列函数,这里简单地将字符串的长度作为哈希值
        return str.length();
    }
};

int main() {
    // 使用自定义散列函数的unordered_set
    std::unordered_set<std::string, MyHash> mySet;

    // 插入元素
    mySet.insert("apple");
    mySet.insert("banana");
    mySet.insert("orange");

    // 查找元素
    std::string target = "banana";
    auto it = mySet.find(target);
    if (it != mySet.end()) {
        std::cout << "Found " << target << " in the set." << std::endl;
    } else {
        std::cout << "Cannot find " << target << " in the set." << std::endl;
    }

    return 0;
}

在上面的示例代码中,我们定义了一个自定义散列函数MyHash,它将字符串的长度作为哈希值。然后,我们使用这个自定义散列函数创建了一个unordered_set容器mySet。我们插入了一些元素,并使用find函数查找了一个元素"banana"。最后,根据find函数的返回结果输出查找结果。

腾讯云提供了云计算相关的产品和服务,例如云服务器、云数据库、云存储等。具体的产品介绍和链接地址可以在腾讯云官方网站上找到。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

C++【初识哈希】

引发 哈希冲突 的概率不同,但最终都会面临 哈希冲突 这个问题,因此需要解决一些方法,解决哈希冲突 3.2、解决方法 主要的解决方法有两种:闭 (开放定址法) 规定:当哈希表中存储的数据量...的实际效果 不尽人意,因为其本质上就是一个 零和游戏,实际中还是 开 用的更多一些 开(链地址法、开链法、哈希桶) 所谓 开 就在原 存储位置 处带上一个 单链表,如果发生 哈希冲突...,就将 冲突的值依次挂载即可 因此也叫做 链地址法、开链法、哈希桶 开 中不需要 负载因子,如果每个位置都被存满了,直接扩容就好了,当然扩容后也需要重新建立映射关系 开 中进行查找时,需要先根据...4.1、使用 哈希表 版的 unordered_set / unordered_map 红黑树 版的 set / map 在功能上 没有差别 可以直接无缝衔接 关于 set 和 map 的使用 详见...:C++【set 和 map 学习及使用unordered_set使用 #include #include #include <unordered_set

24020

C++哈希-使用模拟封装

哈希介绍及概念 2、哈希冲突及解决 3、闭/哈希表的实现 4、开/哈希桶的实现 三、哈希封装实现unordered_map/unordered_set 1、哈希桶的改装 2、unordered_map...,若关键码相等,则搜索成功 该方式即为哈希()方法,哈希方法中使用的转换函数称为哈希()函数,构造出来的结构称为哈希表(Hash Table)(或者称列表) 示例: 哈希函数设置为...常见哈希函数: 直接定制法–(常用) 取关键字的某个线性函数地址:Hash(Key)= A*Key + B 优点:简单、均匀 缺点:需要事先知道关键字的分布情况 使用场景适合查找比较小且连续的情况.../哈希桶的实现 概念: 开法又叫链地址法(开链法),首先对关键码集合用函数计算地址,具有相同地址的关键码归于同一子集合,每一个子集合称为一个桶,各个桶中的元素通过一个单链表链接起来,各链表的头结点存储在哈希表中...0; i < 53; ++i) { ht.Insert(make_pair(rand(), i)); } ht.Insert(make_pair(rand(), 0)); } 结果: 开比较

90020

【C++】哈希——unordered系列容器|哈希冲突|闭|开

系列的关联式容器之所以效率比较高,是因为其底层使用了哈希结构 unordered_set: set的区别在于不支持方向迭代器,只是单向迭代器,其他接口基本set相似 int main() {...,在结构中按此位置取元素比较,若关键码相等,则搜索成功 该方式即为哈希()方法,哈希方法中使用的转换函数称为哈希()函数,构造出来的结构称为哈希表(Hash Table)(或者称列表) 哈希函数设置为...常见哈希函数 直接定制法–(常用) 取关键字的某个线性函数地址:Hash(Key)= A*Key + B 优点:简单、均匀 缺点:需要事先知道关键字的分布情况使用场景:适合查找比较小且连续的情况...哈希函数设计的越精妙,产生哈希冲突的可能性就越低,但是无法避免哈希冲突 ---- 五、解决哈希冲突 解决哈希冲突两种常见的方法是:闭和开 1.闭——开放定址法 闭:也叫开放定址法,当发生哈希冲突时...:考虑到顺序问题,比如abc,cba,如果只乘以131则结果是相同的,所以我们可以加上ch在乘以131 3.开——开链法 开:开法又叫链地址法(开链法),首先对关键码集合用函数计算地址

15420

哈希表你真的学透了嘛

最好的查询是,进行很少的比较次数就能够将元素找到,因此在C++11中,STL又提供了4个unordered系列的关联式容器,这四个容器红黑树结构的关联式容器使用方式基本类似,只是其底层结构不同,本文中只对...unordered_set底层是哈希,而set底层是红黑树,unordered_set使用方法和set没有太大差异,这里不展开介绍。...闭直接定址法根据已知对象转化为整形,已知整形的范围,开辟一定大小的连续空间(比如vector)按照连续空间的下标数据一一映射。一般用于整形,且数据范围相对集中。...开如同前面提到的定义:开法又叫链地址法(开链法),首先对关键码集合用函数计算地址,具有相同地址的关键码归于同一子集合,每一个子集合称为一个桶,各个桶中的元素通过一个单链表链接起来,各链表的头结点存储在哈希表中...而开存储的是指针,默认析构函数会把表内的指针析构掉,但不会去到哈希桶里把节点析构掉,所以在开这里的析构函数需要写。

75430

【C++】哈希表封装实现 unordered_map 和 unordered_set

、unordered_multimap 和 unordered_multiset,这四个容器红黑树结构的关联式容器使用方式基本类似,只是其底层使用的哈希表来实现。...: capacity Iterator 可以看到,unordered_map 的迭代器是单向迭代器,这是因为 unordered_map 底层是开的哈希表,而开的哈希表的哈希桶的结构是单链表...: Hash policy 我们在模拟实现哈希表的时候提到闭的哈希表一般在平衡因子达到 0.7 时就需要进行扩容,否则发生哈希冲突的概率太大,影响效率;而开的哈希表一般将平衡因子控制在 1,这样大部分元素只需要查找...unordered_set 的底层结构为开的哈希表; unordered_set 对 key 的要求是能够转换为整形。... unordered_map 为数不多的不同的地方在于,unordered_set 不需要修改 value,所以也就不支持 operator[] 函数unordered_set 的接口 unordered_set

1.2K30

哈希(unordered_map、unordered_set

unordered系列关联式容器 内部是无序的,查询很快 几个函数说明: 函数声明 功能介绍 operator[] 返回key对应的value值 bucket_count() 返回桶的个数 size_t...(44)->_kv.first << endl; cout << ht.find(4) << endl; ht.print(); } } 开法又叫链地址法...(开链法),首先对关键码集合用函数计算地址,具有相同地 址的关键码归于同一子集合,每一个子集合称为一个桶,各个桶中的元素通过一个单链表链 接起来,各链表的头结点存储在哈希表中。...开比较 应用链地址法(开)处理溢出,需要增设链接指针,似乎增加了存储开销。...unordered_map和unordered_set封装 hash表(开) 几个点: 模板类,第一个模板参数是K,第二个参数T,上层决定这个T是什么 传入仿函数KeyOfT,这个可以从T类型中取K

34920

哈希的简单介绍

最好的查询是,进行很少的比较次数就能够将元素找到,因此在C++11中,STL又提供了4个unordered系列的关联式容器,这四个容器红黑树结构的关联式容器使用方式基本类似,只是其底层结构不同,本文中只对...当向该结构中插入或者搜索元素时只需要对插入或者搜索的元素的关键码进行相对应的计算就可以得到该元素的适合的位置 该方式即为哈希()方法,哈希方法中使用的转换函数称为哈希()函数,构造出来的结构称为哈希表...注意:哈希函数设计的越精妙,产生哈希冲突的可能性就越低,但是无法避免哈希冲突 哈希冲突的解决 解决哈希冲突两种常见的方法是:闭和开:也叫开放定址法,当发生哈希冲突时,如果哈希表未被装满...下面我们就来了解一个高效且常用的办法:开概念 开法又叫链地址法(开链法),首先对关键码集合用函数计算地址,具有相同地址的关键码归于同一子集合,每一个子集合称为一个桶,各个桶中的元素通过一个单链表链接起来...在增容后,许多以前冲突的元素可能就不会冲突了,所以我们可以根据增容的大小来开辟一个新的开,然后把原来的开的元素重新插入到新的开中,再用swap函数交换即可 void _CheckCapacity

7610

C++STL——哈希

底层结构 unordered系列的关联式容器之所以效率比较高,是因为其底层使用了哈希结构。 哈希概念哈希冲突 哈希映射:key值跟储存位置建立关联关系。...哈希冲突的解决 闭——开放定址法 如果映射的位置已经有值了,那么就按照某种规律找其他位置。...折叠法 折叠法是将关键字从左到右分割成位数相等的几部分(最后一部分位数可以短些),然后将这几部分叠加求和,并按列表表长,取后几位作为地址。...可根据列表的大小,选择其中各种符号分布均匀的若干位作为 地址。...使用同一组函数的布隆过滤器可以进行交、并、差运算。 缺陷 有误判率,即存在假阳性(False Position),即不能准确判断元素是否在集合中。

485120

解析hash()数据结构

该方式即为哈希()方法,哈希方法中使用的转换函数称为哈希()函数,构造出来的结构称 为哈希表(Hash Table)(或者称列表)。...开概念 开法又叫链地址法(开链法),首先对关键码集合用函数计算地址,具有相同地 址的关键码归于同一子集合,每一个子集合称为一个桶,各个桶中的元素通过一个单链表链 接起来,各链表的头结点存储在哈希表中..._size = _size; this->Swap(newHt); } } ④ 开比较 应用链地址法处理溢出,需要增设链接指针,似乎增加了存储开销。...插入 通过哈希函数获取待插入元素在哈希表中的位置 如果该位置中没有元素则直接插入新元素,如果该位置中有元素发生哈希冲突, 使用线性探测找到下一个空位置,插入新元素  删除 采用闭处理哈希冲突时..., DELETE }; // 注意:假如实现的哈希表中元素唯一,即key相同的元素不再进行插入 // 为了实现简单,此哈希表中我们将比较直接元素绑定在一起 template<class K, class

58030

C++进阶之哈希(unordered_mapu002Fset的使用及其模拟)

较,若关键码相等,则搜索成功 该方式即为哈希()方法,哈希方法中使用的转换函数称为哈希()函数,构造出来的结构称为哈希表 (Hash Table)(或者称列表) 1.哈希冲突 对于两个数据元素的关键字...常见哈希函数: 直接定制法--(常用) 取关键字的某个线性函数地址:Hash(Key)= A*Key + B 优点:简单、均匀 缺点:需要事先 知道关键字的分布情况 使用场景:适合查找比较小且连续的情况...使用除留余数定制法时,对于扩容后的哈希表对应的哈希函数的除数的值会发生相应的改变,导致下一次查找定制的位置可能不同,所以需要对原来的数据进行再次映射到新的位置上 4 .开法又叫链地址法...(开链法),首先对关键码集合用函数计算地址,具有相同地址的关键码归于同一子集合,每一个子集合称为一个桶,各个桶中的元素通过一个单链表链接起来,各链表的头结点存储在哈希表中 实现步骤: 插入...通过哈希函数找到对应的映射位置,然后头插 ,但是在插入之前需要进行遍历桶节点查看是否存在插入的值相同的节点,没有才进行头插。

56610

C++:哈希表和unordered系列容器的封装

,若关键码相等,则搜索成功 (3)删除元素 对元素的关键码进行同样的计算,找到对应的位置并删除 该方式即为哈希()方法,哈希方法中使用的转换函数称为哈希()函数,构造出来的结构称为哈希表...常见的哈希函数: (1)直接定址法--(常用) 取关键字的某个线性函数地址:Hash(Key)= A*Key + B 优点:简单、均匀 缺点:需要事先知道关键字的分布情况 使用场景:适合查找比较小且连续的情况...,取后几位作为地址。...可根据列表的大小,选择其中各种符号分布均匀的若干位作为地址。...开法又叫链地址法(开链法),首先对关键码集合用函数计算地址,具有相同地址的关键码归于同一子集合,每一个子集合称为一个桶(哈希桶),各个桶中的元素通过一个单链表链接起来,各链表的头结点存储在哈希表中

7410

C++【哈希表的完善及封装】

前言 关于哈希表的两种实现方法:闭、开 已经在上一篇文章中学习过了,闭 存在 踩踏 问题,十分影响效率,因此在实践中往往会选择更加优秀的 开,哈希表(开)又叫做 哈希桶,作为被选中的结构...,我们需要对其进行改造,完善哈希桶,使其最终能封装出 unordered_set unordered_map ---- ️正文 1、哈希表的完善 1.1、拷贝赋值 单链表 是我们自己写的,其中涉及到了..._n; return *this; } 注意: 提供了 拷贝构造 之后,就得提供 默认构造函数 1.2、优化:哈希函数 在实际使用中,往往需要以 字符串 作为存储依据(键值),比如 姓名 快递信息...这是因为 unordered_set 中 普通对象版的 begin() 或 end() 使用的是 哈希表中 const 迭代器,但哈希表中的迭代器相关函数返回的是 普通迭代器 啊,也就是说,存在一个 普通迭代器...unordered_set 和 unordered_map 就算是完成了 ---- 3、性能测试 将自己封装的 unordered_set 库中的 unordered_set 进行性能对比(Release

27260

【C++】STL --- 哈希

哈希概念 unordered 系列的关联式容器之所以效率比较高,是因为其底层使用了哈希结构/哈希算法; 什么是哈希算法呢?哈希又称,本质就是映射,关键字另一个值建立一个关联关系。...解决哈希冲突 解决哈希冲突的两种常见方法是:闭和开。...(1)闭:也叫开放定址法,当发生哈希冲突时,如果哈希表未被装满,说明在哈希表中必然还有空位置,那么可以把 key 存放到冲突位置中的下一个空位置中去;那如何寻找下一个空位置呢?...(2)开概念:开法又叫链地址法(开链法),首先对关键字集合用函数计算地址,具有相同地址的关键字归于同一个子集合,每一个子集合称为一个桶,各个桶中的元素通过一个单链表链接起来,各链表的头结点存储在哈希表中...; 数据量很大时,布隆过滤器可以表示全集,其他数据结构不能; 使用同一组函数的布隆过滤器可以进行交、并、差运算。

11210

【C++】使用哈希表模拟实现STL中的unordered_set和unordered_map

前言 前面的文章我们学习了unordered_set和unordered_map的使用以及哈希表,并且我们提到了unordered_set和unordered_map的底层结构其实就是哈希表。...所以这里有些地方我们就不会特别清楚的去说明了,如果某些地方大家看的不能太明白,建议先搞懂这篇文章——使用红黑树模拟实现STL中的mapset 这里面我们是讲的比较清楚的。...data里面存的数据类型,第二个参数key就是用来获取单独的键值key,因为unordered_map进行查找这些操作的时候是用key进行的,需要比较的话也是用key,但他里面存的是pair。...补充完善:find、erase unordered_set和unordered_map的find和erase我们也搞一下吧,其实就是套一层壳嘛: 9....,随意改就出问题了: 那我们来处理一下: 那其实解决方法和set那里是一样的,库里面也是一样的方法,让unordered_set的迭代器都是哈希表的const迭代器。

11710

【c++】哈希>unordered容器&&哈希表&&哈希桶&&哈希的应用详解

搜索元素 对元素的关键码进行同样的计算,把求得的函数值当做元素的存储位置,在结构中按此位置取元素比较,若关键码相等,则搜索成功 该方式即为哈希()方法,哈希方法中使用的转换函数称为哈希()...常见哈希函数 2.3.1 直接定址法--(常用) 取关键字的某个线性函数地址:Hash(Key)= A*Key + B 优点:简单、均匀 缺点:需要事先知道关键字的分布情况 使用场景:适合查找比较小且连续的情况...其中:i = 1,2,3…, H_0是通过函数Hash(x)对元素的关键码 key 进行计算得到的位置,m是表的大小 对于2.1中如果要插入44,产生冲突,使用解决后的情况为: 研究表明:当表的长度为质数且表装载因子...开法又叫链地址法(开链法),首先对关键码集合用函数计算地址,具有相同地址的关键码归于同一子集合,每一个子集合称为一个桶,各个桶中的元素通过一个单链表链接起来,各链表的头结点存储在哈希表中...return primeList[i]; } 字符串哈希算法:https://www.cnblogs.com/-clq/archive/2012/05/31/2528153.html 2.4.2.5 开比较

16710

哈希封装unordered_map和unordered_set

//考虑unordered_map和unordered_set里面的元素不只是整型,所以用仿函数Hash对元素进行处理 class HashTable { typedef HashNode...: vector _tables;//指针数组 size_t _n; }; } 到此时我们还没有出现新的东西,一切都是在《Map和Set的封装》和《哈希开的实现...而我们自定义类HashTable里面也要用到迭代器,那么反过来迭代器在类的上方,可以向上兼容,所以不用在类的前面申明了。...HTIterator; //... private: vector _tables;//指针数组 size_t _n; }; 此处迭代器里面值得一讲的是++操作(因为哈希表开的结构是单链表...make_pair(it, false); } Hash hs; //负载因子到1就扩容 if (_n == _tables.size()) { //法一:采用闭的扩容方法

7810

【C++】开实现unordered_mapunordered_set的封装

本文主要介绍unordered_mapunordered_set的封装,此次封装主要用上文所说到的开,通过开的一些改造来实现unordered_mapunordered_set的封装 一、...模板参数 由于unordered_set 是 K 模型的容器,而 unordered_map 是 KV 模型的容器,所以需要对结点的参数进行改造,unordered_set可以使用,unordered_map...而data既可以是unordered_set的,也可以是unordered_map的,所以我们需要仿函数来实现不同容器所对应的需求,然后传入: unordered_map返回kv.first template...二、string的特化 字符串无法取模,在这里重新写一遍,字符串无法取模的问题写库的大神们早就想到了 预留一个模板参数,无论上层容器是unordered_set还是unordered_map,我们都能够通过上层容器提供的仿函数获取到元素的键值...abc,cba hash += ch; } return hash; } }; //开 namespace buckethash { template struct

16120

【C++】unordered_set 和 unordered_map 使用 | 封装

使用 unordered_map官方文档 ---- unordered_set 官方文档 ---- set / mapunordered_set / unordered_map 使用功能基本相同,但是两者的底层结构不同...大部分功能与set基本相同,要注意的是使用unordered_set是无序的 插入数据,并使用迭代器打印,会按照插入的顺序输出,但若插入的数据已经存在,则会插入失败 2. unordered_map的使用...封装 对于 unordered_set 和 unordered_map 的封装 是针对于 哈希桶HashBucket进行的, 即 在哈希开 的基础上修改 点击查看:哈希 开具体实现 修改结构定义...代替 ---- 之前实现的模板参数 K ,V分别代表 key value 修改后 , 第一个参数 拿到单独的K类型,是为了 使用 Find erase接口函数的参数为K 第二个参数 T 决定了...拿到的是K类型 还是 K V 类型 针对insert参数 data的两种情况 创建 unordered_set.h头文件,在其中创建命名空间unordered_setunordered_set中实现一个仿函数

26140

【C++】哈希

7、整体代码实现 8、二次探测法 三、开 1、开的概念 2、开的节点结构 3、开的插入删除查找 4、开的扩容 5、开整体代码实现 四、素数做除数哈希桶结构问题 一、哈希的概念及性质...该方法即为 哈希 () 方法,哈希方法中使用的转换函数称为哈希 () 函数,构造出来的结构称为哈希表 (Hash Table) (或者称列表)。...,我们只需要在 key TableSize 取模的地方使用仿函数对象将 key 转换为整形即可;这样,对于常见的 key 类型,哈希表可以通过内置的默认仿函数来完成下标映射,对于用户自定义的 key...(使用的线性探测法来解决哈希冲突) 的模拟实现就基本完成了,其中哈希表的拷贝构造、析构、赋值重载我们使用编译器默认生成的即可 – 对于自定义类型编译器会调用自定义类型的拷贝构造、析构、赋值重载,...,所以 C++ STL 中的unordered_map 和 unordered_set 容器以及 Java 中的 HashMap 和 HashSet 容器其底层哈希表都是使用来实现的,只是某些细节方面有些不同

1K30
领券