首页
学习
活动
专区
工具
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++高阶】哈希函数底层原理探索:从算法设计到实现优化

第一个元素的const迭代器 cend 返回unordered_set最后一个元素下一个位置的const迭代器 unordered_set的查询 函数声明 功能介绍 iterator find(const...,则搜索成功 注意:哈希方法中使用的转换函数称为哈希()函数,构造出来的结构称为哈希表(Hash Table)(或者称列表) 示例:数据集合{1,7,6,4,5,9}; 哈希函数设置为:hash...:闭和开: 也叫开放定址法,当发生哈希冲突时,如果哈希表未被装满,说明在哈希表中必然还有空位置,那么可以把key存放到冲突位置中的“下一个” 空位置中去 线性探测 如果和上面讲的一样...,容易产生数据“堆积”,即:不同关键码占据了可利用的空位置,使得寻找某关键码的位置需要许多次比较,导致搜索效率降低 ️开: 又叫链地址法(开链法),首先对关键码集合用函数计算地址,...newTables[hashi] = cur; cur = next; } _tables[i] = nullptr; } _tables.swap(newTables); } ⛰️开比较

14410

C++【初识哈希】

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

27920
  • 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)); } 结果: 开比较

    92720

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

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

    18420

    哈希表你真的学透了嘛

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

    79430

    【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.5K30

    哈希(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

    37420

    【C++航海王:追寻罗杰的编程之路】一篇文章带你认识哈希

    该方式即为哈希()方法,哈希方法中使用的转换函数称为哈希()函数,构造出的结构称为哈希表(Hash Table)(或者称列表)。...常见哈希函数 1. 直接定址法--(常用) 取关键字的某个线性函数地址:Hash(Key)= A*Key + B。 优点:简单、均匀。 缺点:需要事先知道关键字的分布情况。...注意:哈希函数设计的越精妙,产生哈希冲突的可能性就越低,但是无法避免哈希冲突。 2.4 -> 哈希冲突解决 解决哈希冲突两种常见的方法是:闭和开。...开概念 开法又叫链地址法(开链法),首先对关键码集合用函数计算地址,具有相同地址的关键码归于同一子集合,每一个子集合称为一个桶,各个桶中的元素通过一个单链表链接起来,各链表的头结点存储在哈希表中...开比较 应用链地址法处理溢出,需要增设链接指针,似乎增加了存储开销。

    9310

    【C++高阶】哈希函数底层原理全面探索和深度解析

    ,则搜索成功 注意:哈希方法中使用的转换函数称为哈希()函数,构造出来的结构称为哈希表(Hash Table)(或者称列表) 示例:数据集合{1,7,6,4,5,9}; 哈希函数设置为:hash(...,而如果列表允许有m个地址时,其值域必须在0到m-1之间 哈希函数计算出来的地址能均匀分布在整个空间中 哈希函数应该比较简单 常见哈希函数 直接定址法–(常用) 取关键字的某个线性函数地址:Hash...,但最接近或者等于m的质数p作为除数, 按照哈希函数:Hash(key) = key % p(p <= m), 将关键码转换成哈希地址 2.4 哈希冲突解决 解决哈希冲突两种常见的方法是:闭和开...2.4.3 开 ️开: 又叫链地址法(开链法),首先对关键码集合用函数计算地址,具有相同地址的关键码归于同一子集合,每一个子集合称为一个桶,各个桶中的元素通过一个单链表链接起来,各链表的头结点存储在哈希表中...newTables[hashi] = cur; cur = next; } _tables[i] = nullptr; } _tables.swap(newTables); } 2.4.4 开比较

    19210

    哈希的简单介绍

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

    9210

    C++STL——哈希

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

    519120

    解析hash()数据结构

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

    70530

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

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

    8710

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

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

    60210

    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

    32060

    【C++】STL --- 哈希

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

    14610

    【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迭代器。

    17910

    哈希封装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()) { //法一:采用闭的扩容方法

    9010

    【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 开比较

    19710
    领券