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

如何将C++ unordered_set用于自定义类?

在C++中,可以使用unordered_set容器来存储自定义类的对象。unordered_set是一个无序的容器,它使用哈希表来实现快速的查找和插入操作。

要将自定义类用于unordered_set,需要完成以下几个步骤:

  1. 定义自定义类:首先,需要定义一个自定义类,包括成员变量和成员函数。例如,我们定义一个名为Person的类,包含name和age两个成员变量。
代码语言:cpp
复制
class Person {
public:
    std::string name;
    int age;
};
  1. 实现哈希函数:unordered_set使用哈希函数来确定对象在容器中的位置。因此,需要为自定义类实现一个哈希函数。哈希函数应该返回一个哈希值,可以使用std::hash模板来实现。
代码语言:cpp
复制
struct PersonHash {
    std::size_t operator()(const Person& p) const {
        return std::hash<std::string>()(p.name) ^ std::hash<int>()(p.age);
    }
};

在上面的例子中,我们将name和age的哈希值进行异或运算来生成最终的哈希值。

  1. 实现相等函数:unordered_set使用相等函数来比较两个对象是否相等。需要为自定义类实现一个相等函数。相等函数应该返回一个布尔值,表示两个对象是否相等。
代码语言:cpp
复制
struct PersonEqual {
    bool operator()(const Person& p1, const Person& p2) const {
        return p1.name == p2.name && p1.age == p2.age;
    }
};

在上面的例子中,我们比较了两个Person对象的name和age是否相等。

  1. 创建unordered_set对象:现在可以使用自定义类和相应的哈希函数、相等函数来创建unordered_set对象了。
代码语言:cpp
复制
std::unordered_set<Person, PersonHash, PersonEqual> personSet;

在上面的例子中,我们创建了一个名为personSet的unordered_set对象,其中的元素是Person对象,使用PersonHash作为哈希函数,使用PersonEqual作为相等函数。

  1. 插入和查找元素:可以使用insert()函数向unordered_set中插入元素,使用find()函数查找元素。
代码语言:cpp
复制
Person p1{"Alice", 25};
Person p2{"Bob", 30};

personSet.insert(p1);
personSet.insert(p2);

auto it = personSet.find(p1);
if (it != personSet.end()) {
    // 找到了元素
} else {
    // 没有找到元素
}

在上面的例子中,我们插入了两个Person对象,并使用find()函数查找了一个Person对象。

这样,就可以将C++ unordered_set用于自定义类了。请注意,上述代码中的Person类和相关函数只是示例,实际应用中需要根据自己的需求进行相应的修改和实现。

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

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

相关·内容

C++ 自定义数组模板

本篇通过自定义数组模板,实现python列表的绝大部分函数,包括: 求最大值 求最小值 排序 在尾部添加元素 在指定位置(默认尾部)删除元素 在指定位置插入元素 在尾部添加进另外一个数组 查找指定值...移除第一次出现的指定值 从尾到头反向排列 切片功能 两个数组相等的判断 列表的数乘复制 等等 以及numpy中的arange函数 涉及到的知识点有: 模板 函数模板 友元函数模板的外实现...,需要提前让编译器知道MyArray是一个模板 template class MyArray; //友元函数模板外实现,需要让编译器提前知道它的存在 template int len(MyArray& arr) { return arr.m_length; } //友元函数模板外实现,需要让编译器提前知道它的存在 //重载<< template...cannot be zero"); } template class MyArray { friend int len(MyArray& arr);//友元函数模板外实现的内声明

1.1K20

C++】泛型编程 ⑮ ( 模板示例 - 数组模板 | 自定义中持有指针成员变量 )

一、支持 数组模板 存储的 自定义 1、可拷贝和可打印的自定义 在上一篇博客 中 , 定义了 可拷贝 与 可打印 的 自定义 Student , 可以被存放到 数组模板 中 ; 由于其 成员变量...out << "name : " << s.m_name << " , age : " << s.m_age << " ; "; return out; } 2、改进方向 本篇博客中 , 开始讨论 自定义...中是 char* 类型指针的情况 , 这里涉及到了 堆内存分配 以及 深拷贝 问题 ; 如果将上述 Student 中的 char m_name[32] 数组成员 , 改为 char* m_name...堆内存管理 , 在 构造函数中 分配堆内存 ; 在 析构函数中 释放堆内存 ; 为了避免 浅拷贝 问题出现 , 需要 进行 等号 = 运算符重载 ; 以及 重写 拷贝构造函数 ; 为了使用 cout 打印该 对象..., 需要 进行 左移 << 运算符重载 ; 3、改进方向 - 构造函数 在的 无参构造函数 和 有参构造函数中 , 使用 new 关键字 , 自动在堆内存中分配内存 , 然后为 堆内存 中的空间赋值

13310

C++ 开发中,使用模板实现自定义数组

需求描述: 通过使用 C++模板的特性,实现一个能够存储任意类型的数组。可以通过在尾部追加的方式在数组中完成数据传入,且可以通过尾部操作删除数组最后一个元素。...T *m_address; // 堆区 }; class Demo { public: Demo() = default; // 使用系统默认构造函数,此无参构造函数不可省略,也可以使用自定义无参构造函数...cout << "demo 数组中的第" << i + 1 << "个元素的值为:" << c_array[i] << endl; } cout << "在数组中插入自定义类型...: 自定义类型数组中的第1个人的 id 为:1 姓名为:赵云 自定义类型数组中的第2个人的 id 为:3 姓名为:刘备 自定义类型数组中的第3个人的 id 为:2 姓名为:诸葛亮 Note: 自定义类型数组中的无参构造函数不能省略...]': /cygdrive/h/workspaces/c++/example/main.cpp:135:28: required from here /cygdrive/h/workspaces/c

84610

C++】异常处理 ⑥ ( 异常生命周期 | 抛出自定义对象异常 | 自定义对象异常的生命周期 | 抛出 自定义引用类型 异常 | 抛出 自定义指针类型 异常 )

一、C++ 异常处理 - 抛出自定义对象异常 1、抛出 异常对象 如果 抛出的 指针类型 , 指向的是 实际的对象 , 那么就要涉及到 对象的 内存空间的 分配 与 释放 ; 涉及到 内存空间 的 申请...和 释放 , 就需要考 讨论 异常 的生命周期 , 什么时候申请内存 , 什么时候释放内存 ; 2、代码示例 - 抛出 异常对象 下面的代码中 , 声明了 3 个自定义 Exception1 , Exception2..., Exception3 ; 在不同的时机 , 抛出不同的 自定义 对象 ; 抛出异常 , 直接使用 throw 关键字抛出 , Exception1 对象在抛出时创建 ; throw Exception1...三、C++ 异常处理 - 抛出 自定义引用类型 异常 1、不能同时拦截 对象类型 和 引用类型 在 try-catch 代码块中 , 不能同时拦截 对象类型 和 引用类型 , 系统会将这两种类型 看做...四、C++ 异常处理 - 抛出 自定义指针类型 异常 1、可以同时拦截 指针类型 和 引用类型 在 try-catch 代码块中 , 可以同时拦截 指针类型 和 引用类型 的 异常 , 系统会将这两种类型

14810

C++自定义的对象对于其私有变量的访问

“在C++的作用域内,可以对其私有成员变量进行操作” 以下语法规则是不言自明的: 在自定义A的成员函数中,可以对该类的私有成员变量进行赋值等操作,但是在定义之外所声明的A的对象aobj是不可以直接访问...A的私有变量的,只有通过在A的成员函数中开放访问其私有变量的接口,对象aobj才可以对私有变量进行操作。...在开发一个的过程中,我做了如下的定义 A class A { private: int m_para; public: void Func(); } void A::Func()...这个看似不是问题的问题困扰了我几天,最后对这一问题的解答也就是开篇的第一句话———— 在C++的作用域内,可以对其私有成员变量进行操作 关键就在于对“作用域”的理解。...由于我在A的成员函数中定义的是A的临时对象,因此仍在其作用域内,所定义的临时对象也就可以直接访问其私有成员变量了。

1.4K10

C++】异常处理 ⑧ ( 标准异常 | 标准异常继承结构 | 常用的标准异常 | 自定义异常继承 std::exception 基 )

一、抛出 / 捕获 多个类型异常对象 1、标准异常C++ 语言中 , 提供了一系列的 " 标准异常 " , 这些 " 标准异常 " 都继承了 std::exception 基 , 在 标准库...定义在 头文件中 ; #include 标准异常 std::exception 中提供了 what() 函数 , 用于获取异常报错信息 , what...当数值下溢 , 即数值太小而无法表示时 , 会抛出此异常 ; std::system_error : 当系统调用失败时 , 会抛出此异常 ; std::system_fault : 这是一个用于指示由操作系统引起的错误的异常...自定义继承 std::exception , 通过构造函数设置异常信息 , 重写 what 函数 , 在该函数中返回异常信息 ; // 自定义实现标准异常 class eSize : public...std::exception 基 代码示例 : #include #include using namespace std; // 自定义实现标准异常

33610

C++核心准则C.120:层次体系只用于表现固有的阶层结构‍

参考链接: C++多重,多层和阶层式继承 C.120: Use class hierarchies to represent concepts with inherent hierarchical structure...(only)  C.120:层次体系只用于表现固有的阶层结构‍  Reason(原因)  Direct representation of ideas in code eases comprehension...不要将非阶层领域的概念表现为层次。 ...这段代码接口定义的函数大多数派生都无法很好地实现。基成了实现时的负担。进一步说,容器的用户实际上无法依赖成员函数合理,高效地执行有意义的操作;它可能会抛出异常。...在所有使用非公开基B而派生D没有覆盖B的虚函数或者访问B的保护型数据成员时进行提示。其中B不属于下面的情况:空,D的模板参数或参数包,被D特化的模板

37540

C++核心准则C.120:层次体系只用于表现固有的阶层结构‍

.120: Use class hierarchies to represent concepts with inherent hierarchical structure (only) C.120:层次体系只用于表现固有的阶层结构‍...不要将非阶层领域的概念表现为层次。...这段代码接口定义的函数大多数派生都无法很好地实现。基成了实现时的负担。进一步说,容器的用户实际上无法依赖成员函数合理,高效地执行有意义的操作;它可能会抛出异常。...发现拥有大量什么也不做只会抛出异常的数据成员的。...在所有使用非公开基B而派生D没有覆盖B的虚函数或者访问B的保护型数据成员时进行提示。其中B不属于下面的情况:空,D的模板参数或参数包,被D特化的模板

34420

C++】泛型编程 ⑭ ( 模板示例 - 数组模板 | 容器思想 | 自定义可拷贝 - 深拷贝与浅拷贝 | 自定义可打印 - 左移运算符重载 )

一、容器思想 1、自定义可拷贝 - 深拷贝与浅拷贝 上一篇博客 【C++】泛型编程 ⑬ ( 模板示例 - 数组模板 | 构造函数和析构函数 的 声明与实现 | 普通成员函数 的 声明与实现 | 外部友元函数...的 声明与实现 ) 中 , 实现了一个 数组 模板 , 数组 中的 数据元素 是 泛型类型 , 可以是任意类型 ; 也就是说 , 该数组可以存储 任意类型 的数据 , 包括 自定义对象 ; 该数组...char m_name[32] 是 在定义时 , 直接分配好的 , 如果 自定义 中有 指针类型的成员变量 , 如 char* m_name , 涉及到 动态分配内存 , 如果没有定义 拷贝构造函数...必须自己实现 深拷贝 的 拷贝构造函数 ; 编写的 , 可以存储到 数组模板 容器 中 , 那么 该类 必须 支持 拷贝工作 , 具体一些就是 深拷贝 工作 ; 2、自定义可拷贝 - 代码示例...- 左移运算符重载 数组模板 中 , 实现了 左移运算符 打印日志 , 如果 数组中 存储 自定义对象 想要通过 cout 打印出来 , 那么 该自定义 必须 进行 左移运算符重载操作 ; 声明

16310

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

这其实是C++的发展历史导致的。...在 unordered_map 中,键值通常用于惟一地标识元素,而映射值是一个对象,其内容与此键关联。键和映射值的类型可能不同。...Hash 就是我们模拟实现中的仿函数 HashFunc,它用来将 key 转换为整形,从而使得 key 可以取模并成功映射,其中整形/指针类型和 string 类型的 HashFunc 是系统内置的,而其他自定义类型的...- C++ Reference (cplusplus.com) 构造 4、unordered_multiset unordered_multiset 也一样,与 unordered_set 不同的地方在于其允许出现重复元素...:unordered_set - C++ Reference (cplusplus.com) ---- 二、哈希表的迭代器 和红黑树一样,哈希表也需要单独定义一个来实现迭代器,不过由于哈希表的迭代器是单向的

1.1K30

从零开始学C++之模板(二):模板、Stack的模板实现(自定义链栈方式,自定义数组方式)

一、模板 模板:将定义中的数据类型参数化 模板实际上是函数模板的推广,可以用相同的模板来组建任意类型的对象集合 (一)、模板的定义 template   class  ...: 名  对象名称; 对于函数模板与模板,模板参数并不局限于类型(类型,基本类型,模板实例),普通值也可以作为模板参数 二、Stack的模板实现 在前面曾经分别使用C/C...++实现了一个链栈,栈中只能放进int类型数据,现在使用模板来重新实现Stack,可以存放多种数据类型,分别使用自定义链栈方式以及自定义数组实现。...(一)、自定义链栈方式: stack.h: /************************************************************************* > File...参考: C++ primer 第四版 Effective C++ 3rd C++编程规范

1.4K00

开启图结构的学习:图的创建和遍历

顶点 对于一个顶点而言,我们需要定义什么呢?...注意:如果使用自定义类型,需要重写哈希函数,请参考原来的文章: 如何使用哈希容器来操作自定义类型 图的定义如下: class Graph{ public: unordered_map nodes; unordered_set edges; }; 2 图的创建过程 当我们准备好了这些之后,我们就可以建立整个图了,我们使用邻接矩阵的形式,只需要输入一个边的权重...break; // 每次只访问某个节点的一个分支,一直深入下去访问 } } } cout << endl; } 5 资源分享 以上完整代码文件(C+...希望大家多多支持哦~ 公众号简介:分享算法工程师必备技能,谈谈那些有深度有意思的算法,主要范围:C++数据结构与算法/深度学习(CV),立志成为Offer收割机!

51920

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

); return val; } }; 修改之后,三个字符串计算出的值分别为:3634、5100、3702 显然此时的值更为分散,符合我们的需求 关于 static_cast 这是 C+...要设计为 单向迭代器(只支持 ++) 关于多模板参数 template 的设计原理这里不再阐述,感兴趣的可以看看这篇文章:《C+...中的私有成员 _table,这是不行的,为了让其能成功访问,我们可以把 迭代器 设为 哈希表 的 友元 同时,在 哈希表 中增加 迭代器操作 的相关函数 template<class K, class..." << " | " << ret.second << endl; } 测试结果: 显然,第二次插入时均失败(因为冗余了) 2.5、unordered_map 新增 operator[ ] 作为同时用于...是纯净版的哈希表 《哈希表的完善及封装》 ---- 总结 以上就是本次关于 C++【哈希表的完善及封装】的全部内容了,在本文中,我们首先将 哈希表 进行了完善,解决了一些深拷贝问题,新增了迭代器;当

25860

C++参考的翻译或校对

做新年规划的时候,我说过要翻译C++常用的参考。C++的参考,其实别人已经翻译完了,只是部分内容需要校对。由于网站结构中大量使用了模板,同一个函数只需要翻译一个地方,所以四天就弄完了。...C++的参考其实最需要翻译。因为C++为了填C继承过来的坑,标准库增加了很多用于替代的设施。而国内的教程更新缓慢,这份参考如果不翻译,我估计到了2020年也不会完全普及。...以下是校对完成的,希望大家继续参与: unique_ptr shared_ptr weak_ptr duration function...结尾的单字节字符串 Null结尾的多字节字符串 Null结尾的宽字符串 容器 array vector deque list forward_list set multiset map multimap unordered_set

59830
领券