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

在一个类方法中,两个`unordered_set`s在C++中的交集“不工作”,但与`set`一起工作?

在C++中,unordered_set是一种无序的容器,它使用哈希表实现,而set是一种有序的容器,它使用红黑树实现。由于它们底层的实现方式不同,导致在进行交集操作时表现不同。

当我们尝试在一个类方法中计算两个unordered_set的交集时,可能会遇到问题。这是因为unordered_set是无序的,它不会对元素进行排序,而是根据哈希值进行存储和访问。因此,交集操作可能会导致元素的顺序发生变化,从而导致结果不符合预期。

相反,set是有序的,它会对元素进行排序并保持有序状态。因此,在类方法中使用set计算交集时,可以得到正确的结果。

为了解决这个问题,我们可以使用set来代替unordered_set进行交集操作。或者,我们可以将unordered_set中的元素复制到一个vector中,然后对vector进行排序,最后使用set_intersection算法来计算交集。

下面是一个示例代码:

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

class MyClass {
public:
    void intersection() {
        std::unordered_set<int> set1 = {1, 2, 3, 4, 5};
        std::unordered_set<int> set2 = {4, 5, 6, 7, 8};

        // 使用set代替unordered_set进行交集操作
        std::set<int> intersectionSet;
        for (const auto& element : set1) {
            if (set2.count(element) > 0) {
                intersectionSet.insert(element);
            }
        }

        // 输出交集结果
        for (const auto& element : intersectionSet) {
            std::cout << element << " ";
        }
        std::cout << std::endl;
    }

    void intersectionWithSorting() {
        std::unordered_set<int> set1 = {1, 2, 3, 4, 5};
        std::unordered_set<int> set2 = {4, 5, 6, 7, 8};

        // 将unordered_set中的元素复制到vector中
        std::vector<int> vector1(set1.begin(), set1.end());
        std::vector<int> vector2(set2.begin(), set2.end());

        // 对vector进行排序
        std::sort(vector1.begin(), vector1.end());
        std::sort(vector2.begin(), vector2.end());

        // 使用set_intersection计算交集
        std::vector<int> intersectionVector;
        std::set_intersection(vector1.begin(), vector1.end(), vector2.begin(), vector2.end(), std::back_inserter(intersectionVector));

        // 输出交集结果
        for (const auto& element : intersectionVector) {
            std::cout << element << " ";
        }
        std::cout << std::endl;
    }
};

int main() {
    MyClass obj;
    obj.intersection();
    obj.intersectionWithSorting();

    return 0;
}

在上述示例代码中,intersection方法使用set代替unordered_set进行交集操作,而intersectionWithSorting方法则使用排序后的vectorset_intersection算法来计算交集。这样可以确保得到正确的交集结果。

腾讯云相关产品和产品介绍链接地址:

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

相关·内容

C++高阶】深度剖析:从零开始模拟实现 unordered 奥秘

前言:C++标准库,unordered_map和unordered_set作为高效无序容器,以其基于哈希表实现方式,为数据快速查找、插入和删除提供了强有力支持。...,则为K KeyOfT:通过T来获取key一个仿函数 HF: 哈希函数仿函数对象类型,哈希函数使用除留余数法,需要将Key转换为整形数字才能 取模 // unordered_set unordered_set...) :_data(data) ,_next(nullptr) {} }; 而在上一篇文章,我们有介绍了一个关于非整形求关键值仿函数HashFunc,模拟实现是可以直接加在模拟实现上...HashTable迭代器 迭代器基本设计 代码示例(C++): // 为了实现简单,哈希桶迭代器需要用到hashBucket本身,所以我们要进行一下前置声明,并且我们 HashTable 也要设置一个友元...总结 本文探索之旅,我们深入剖析了unordered_mapunordered_set内部机制,并通过模拟实现这两个容器,不仅加深了对哈希表这一重要数据结构理解,还锻炼了编程能力和问题解决能力

7510

移情别恋c++ ദ്ദി˶ー̀֊ー́ ) ——13.map&&set(无习题)

C++ set 和 map 容器详细总结 1. 概述 C++ 标准模板库(STL)提供了多种关联容器,用于管理键值对和集合数据。其中,set 和 map 是最常用两种关联容器。...红黑树,元素按照键值自动排序,因此 set 插入操作不仅将元素添加到集合,还会自动维护元素顺序。...有序数据存储:由于 set 元素是有序,可以用于需要对数据进行排序并快速查找场景。 集合操作:set 可以用于实现集合基本操作,如交集、并集和差集。...unordered_set 和 unordered_map:插入、删除和查找操作平均时间复杂度为 O(1),最坏情况下为 O(n)。...示例代码总结 以下是一个完整示例代码,展示了 set、map、multiset、multimap、unordered_set 和 unordered_map 基本使用方法: #include <iostream

9910
  • 哈希表:哈希值太大了,还是得用set

    给「代码随想录」一个星标吧! ❝如果哈希值比较少、特别分散、跨度非常大,使用数组就造成空间极大浪费! ❞ 第349题. 两个数组交集 题意:给定两个数组,编写一个函数来计算它们交集。 ?...「说明:」 输出结果每个元素一定是唯一。 我们可以不考虑输出结果顺序。 思路 这道题目,主要要学会使用一种哈希数据结构:unordered_set,这个数据结构可以解决很多类似的问题。...但是要注意,「使用数据来做哈希题目,都限制了数值大小,例如哈希表:可以拿数组当哈希表来用,哈希值不要太大题目中只有小写字母,或者数值大小[0- 10000] 之内等等。」...此时就要使用另一种结构体了,set ,关于setC++ 给提供了如下三种可用数据结构: std::set std::multiset std::unordered_set std::set和std:...哈希法使用unordered_set C++代码 class Solution { public: vector intersection(vector& nums1, vector

    1K30

    哈希值太大了,还是得用set

    两个数组交集 https://leetcode-cn.com/problems/intersection-of-two-arrays/ 题意:给定两个数组,编写一个函数来计算它们交集。 ?...说明:输出结果每个元素一定是唯一。我们可以不考虑输出结果顺序。 思路 这道题目,主要要学会使用一种哈希数据结构:unordered_set,这个数据结构可以解决很多类似的问题。...此时就要使用另一种结构体了,set ,关于setC++ 给提供了如下三种可用数据结构: std::set std::multiset std::unordered_set std::set和std...nums1.end()); for (int num : nums2) { // 发现nums2元素 nums_set里又出现过 if...int i : resSet) { resArr[index++] = i; } return resArr; } } 相关题目 350.两个数组交集

    48820

    C++高阶】哈希函数底层原理探索:从算法设计到实现优化

    clear() 清空容器中有效元素个数 void swap(unordered_map&) 交换两个容器元素 unordered_set unordered_set在线文档说明 unordered_set...迭代器 函数声明 功能介绍 begin 返回unordered_set一个元素迭代器 end 返回unordered_set最后一个元素下一个位置迭代器 cbegin 返回unordered_set...map和set还是有点相似的,我们再来几道题目来熟练掌握它们使用 重复n次元素 两个数组交集 2....,新挑战需求层出穷。...只有这样,我们才能在复杂多变数据处理环境,始终保持高效、稳定、安全性能表现 希望各位在未来学习工作,保持对知识渴望追求,勇于挑战自我,不断探索未知领域。

    14410

    C++】unordered_map和unordered_set使用 及 OJ练习

    C++11,STL又提供了4个unordered系列关联式容器,这四个容器红黑树结构关联式容器使用方式基本一样,只是其底层结构不同。...然后,我们遍历其中一个数组,遍历同时去依次判断当前元素在不在另一个数组,如果在,就是交集。...; } }; 5.3 两个数组交集 II 题目链接: link 来看这道题,是上一题一个升级版,还是求交集,但是多了一些要去: 返回结果每个元素出现次数,应与元素两个数组中都出现次数一致...思路分析 那这道题关键其实在于控制这个次数: 最终返回交集中,每个元素出现次数要和它们两个数组中出现次数一样,如果在两个数组中出现次数不一样,则取较小值。...如果不删除,后面第二个数组再遇到的话,次数就会超。 如果看思路不太理解的话可以结合下面的代码看。

    30310

    C++】unordered系列容器封装

    unordered_set unordered_set是只储存key值容器!和set相似,用来去重或者判断是否存在!...2 改造哈希桶 2.1 模版参数 unordered_map 和 unordered_set底层是开散列版本哈希表(哈希桶),但是他们两个储存数据却不一样:一个是键值对pair ,...给两个文件,分别有100亿个整数,我们只有1G内存,如何找到两个文件交集?...对于每个桶,可以在内存处理两个文件整数,找到交集。 合并结果:将所有小文件交集结果合并起来,得到最终交集 方法二:外部排序 排序:分别对两个文件进行外部排序。...合并:使用外部归并排序思想,逐步合并两个文件数据(取整数出现次数少那部分),找到交集

    10910

    C++STL——哈希

    最好查询是,进行很少比较次数就能够将元素找到,因此C++11,STL又提供了4个unordered系列关联式容器,这四个容器红黑树结构关联式容器使用方式基本类似,只是 其底层结构不同。...给两个文件,分别有100亿个整数,我们只有1G内存,如何找到两个文件交集? 这道题和上一道题区别不大,开两个位图,遍历两个位图,如果都为1就是交集。 4....(但是无法避免,只能缩小概率) 布隆过滤器不能直接支持删除工作,因为删除一个元素时,可能会影响其他元素。...这里两个大文件各分成1000份小文件:HashFunc(query)%1000 然后通过一个两个小文件组成一对,找出他们交集即可。...这里如果某个小文件超过规定大小,那么就从头开始继续分,像之前哈希切割一样。 近似算法: 用一个布隆过滤器,两个数据交集一定会映射到一起去,但是也会有不是的映射到一起去。 2.

    519120

    常见三种哈希结构(数组,set,map)

    有效字母异位词(力扣)(C语言题解)-CSDN博客 该题为什么想到哈希:涉及到快速查找数组是否出现某元素(nums2找是否有nums1字母) 为什么用数组: 字母最多只有26个,数量较少,且大小确定...两个数组交集 - 力扣(LeetCode) C语言题解:[349. 两个数组交集](C语言)(两种解法:双指针+排序,哈希)-CSDN博客 C++题解: [349....两个数组交集](C++)(第三种解法:set)-CSDN博客 该题为什么想到哈希:涉及到快速查找数组是否出现某元素(找nums2数字是否nums1出现过) 为什么用数组: 现在力扣数据改了...两数之和(C++)(map)(哈希算法)-CSDN博客 该题为什么想到哈希:涉及到快速查找数组是否出现某元素(找target-nums[i]是否nums1出现过) 为什么用map: 它涉及了找target-nums...哈希表 否 否 否 O(1) O(1) 三种使用场景: std::set: 要求集合有序 std::multiset: 要求集合有序 且 有重复数据时候用 std::unordered_set:

    10010

    【数据结构和算法】独一无二出现次数

    示例 1: 输入:arr = [1,2,2,1,1,3] 输出:true 解释:该数组,1 出现了 3 次,2 出现了 2 次,3 只出现了 1 次。没有两个出现次数相同。...理解哈希表如何工作是解决这类问题关键。 选择合适哈希函数:一个哈希函数能够将键均匀地分布到哈希表,以减少冲突。你需要选择或设计一个能够满足题目要求哈希函数。...否则如果没有重复,他们长度肯定是一样。 2.3 方法二: set 判断 思路算法: 先计算每个数出现次数。...set集合如果有相同元素,就会存储失败,返回false,每次存储时候我们只要判断是否存储成功即可。...2.4 方法三:使用数组 思路算法: 题中提示数组大小和长度都有了限制,所以我们还可以使用数组。 先创建一个 2001 容量数组,记录每个数出现次数。

    13310

    C++【初识哈希】

    无法继续存入,此时就发生了 哈希冲突 不同 哈希函数 引发 哈希冲突 概率不同,最终都会面临 哈希冲突 这个问题,因此需要解决一些方法,解决哈希冲突 3.2、解决方法 主要解决方法有两种:闭散列...因此 C++11 标准,利用 哈希表 作为底层结构,重写了 set / map,就是 unordered_set / unordered_map 图片出自:C++新特性之三:标准库新增容器...4.1、使用 哈希表 版 unordered_set / unordered_map 红黑树 版 set / map 功能上 没有差别 可以直接无缝衔接 关于 set 和 map 使用 详见.../ map 使用代码,可以无缝衔接,所以说正常使用就好了,无非就是名字长一些 C++ 为了确保向前兼容性,无法修改原来名字,因此只能加上 unordered 以示区分 相比之下,Java 两个不同版本...,哈希各方面都比红黑强,在数据 有序 情况下,红黑更胜一筹 单就 查找 这一个方面来说:哈希 一骑绝尘,远远将红黑甩了身后 ---- 总结 以上就是本次关于 C++【初识哈希】全部内容了,本文中

    28020

    哈希表:总结篇!(每逢总结必经典)

    「一般来说哈希表都是用来快速判断一个元素是否出现集合里」。 对于哈希表,要知道「哈希函数」和「哈希碰撞」哈希表作用. 哈希函数是把传入key映射到符号表索引上。...接下来是常见三种哈希结构: 数组 set(集合) map(映射) C++语言中,set 和 map 都分别提供了三种数据结构,每种数据结构底层实现和用途都有所不同,关于哈希表,你该了解这些!...set作为哈希表 哈希表:两个数组交集中我们给出了什么时候用数组就不行了,需要用set。 这道题目没有限制数值大小,就无法使用数组来做哈希表了。...哈希表:快乐数,我们再次使用了unordered_set来判断一个数是否重复出现过。 map作为哈希表 哈希表:两数之和map正式登场。 来说一说:使用数组和set来做哈希法局限。...哈希表:解决了两数之和,那么能解决三数之和么?我给出了哈希法和双指针两个解法,大家就可以体会到,使用哈希法还是比较麻烦。 所以18. 四数之,15.三数之和都推荐使用双指针法!

    91830

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

    } 同样,需要对 扩容 地方进行改造 改造之后,哈希表 初始大小变为 53 1.4、新增:迭代器 哈希表 理应提供一个 迭代器 对其中值进行判断,因为 桶 是一个 单链表,只能向前走,...} 在这个函数,访问了 哈希表 私有成员 _table,这是不行,为了让其能成功访问,我们可以把 迭代器 设为 哈希表 友元 同时, 哈希表 增加 迭代器操作 相关函数 template...现在面临一个尴尬问题:两个参数不同类型,如何同时使用一种获取 key 方法?...//…… } } }; 注意: 新增了迭代器之后,Find 返回值变成了 iterator 对于 哈希表 来说,主要改动其实就两个:模板参数改变、获取哈希表对象 key 值 如此一来,unordered_set...这是因为 unordered_set 普通对象版 begin() 或 end() 使用是 哈希表 const 迭代器,哈希表迭代器相关函数返回是 普通迭代器 啊,也就是说,存在一个 普通迭代器

    32060

    一文学会哈希法解题

    哈希法通常使用如下三种数据结构 : 数组 set map 接下来我们分别看一下三个容器哈希法应用。 数组哈希法应用 leetcode 383.赎金信 ?...第一点“为了暴露赎金信字迹,要从杂志上搜索各个需要字母,组成单词来表达意思” 这里说明杂志里面的字母不可重复使用。 第二点 “你可以假设两个字符串均只含有小写字母。”...349.两个数组交集 ?...此时我们就要使用另一种结构体了,set ,关于setC++ 给我们提供了如下三种可用数据结构。...四数之和,使用哈希方法超时情况下做到对结果去重很困难。 而这道题目 相当于说 不用考虑重复元素,是四个独立数组,所以相对于题目18. 四数之和,0015.三数之和,还是简单了不少。

    39130

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

    key,之所以要设计它是因为哈希表同时也是 unordered_set 底层容器, unordered_set 是 K模型容器,而 unordered_map 是 KV模型容器,而哈希表要能够兼容它们... unordered_map 为数不多不同地方在于,unordered_set 不需要修改 value,所以也就不支持 operator[] 函数; unordered_set 接口 unordered_set...- C++ Reference (cplusplus.com) 构造 4、unordered_multiset unordered_multiset 也一样, unordered_set 不同地方在于其允许出现重复元素...:unordered_set - C++ Reference (cplusplus.com) ---- 二、哈希表迭代器 和红黑树一样,哈希表也需要单独定义一个来实现迭代器,不过由于哈希表迭代器是单向...声明为友元,这样我们才能正确实现迭代器 ++ 功能; 注意: 1、由于我们迭代器增加了一个哈希表指针变量 _ht,所以我们 HashTabel 定义 begin() 和 end()

    1.6K30

    哈希表不过如此....

    接下来是常见三种哈希结构: 数组 set(集合) map(映射) C++语言中,set 和 map 都分别提供了三种数据结构,每种数据结构底层实现和用途都有所不同,关于哈希表,你该了解这些!...上面两道题目用map确实可以,使用map空间消耗要比数组大一些,因为map要维护红黑树或者符号表,而且还要做哈希函数运算。所以数组更加简单直接有效! set作为哈希表 349....两个数组交集中我们给出了什么时候用数组就不行了,需要用set。 这道题目没有限制数值大小,就无法使用数组来做哈希表了。...202.快乐数,我们再次使用了unordered_set来判断一个数是否重复出现过。 map作为哈希表 1.两数之和map正式登场。 来说一说:使用数组和set来做哈希法局限。...15.三数之和我给出了哈希法和双指针两个解法,大家就可以体会到,使用哈希法还是比较麻烦。 所以18. 四数之和,15.三数之和都推荐使用双指针法!

    59910

    C++高阶】探索STL瑰宝 mapset:高效数据结构奥秘技巧

    树型结构关联式容器主要有四种:map、set、multimap、multiset 共同点是:使用平衡搜索树(即红黑树)作为其底层结果,容器元素是一个有序序列 关联式容器是C++ STL中一重要容器...unordered_set容器慢,但它们允许根据顺序对子集进行直接迭代 set底层是用二叉搜索树(红黑树)实现 特征: map/multimap不同,map/multimap存储是真正键值对...upper_bound:返回>该值元素位置迭代器 这两个函数通常可以和erase结合使用删除一段迭代器区间 5. map multimap map概念 概念: map 是 C++ 标准库一个关联容器...总结拓展 实际应用 这里推荐两个题目让大家巩固setmap 前K个高频单词 两个数组交集 总结 随着我们深入探讨STL(Standard Template Library)map和set...,我们不难发现,这两个容器类型C++编程扮演着举足轻重角色。

    40210

    C++unordered_set、unordered_map超详细封装过程,处理底层细节

    单论两个链表确实找不到交集别忘了无论它们两个相距多远,哪怕相隔银河,它们也始终都在同一个哈希表,所以当一个链表走到头时,我们可以借助哈希表找到下一个不为空链表。...通过报错不难发现,问题出现在哈希表 _tables是一个私有成员,哈希表外是不能直接访问,解决这个问题也简单,只需要将迭代器作为哈希表友元即可。 友元模版声明时需要带上模版参数。...,增加两个模版参数来实现对普通迭代器复用。...是不可以,因为我们现在是实现封装,因此不可能越过unordered_set和unordered_map去直接操作哈希表,那在这里给缺省值就写死了,当遇到日期这种特殊类型时我们需要自己实现相应仿函数来支持取模...我们应该在unordered_set和unordered_map层面加仿函数缺省值,这样如果遇到日期这种特殊类型需求,我们就可以按需传仿函数完成整型转换。

    9010
    领券