首页
学习
活动
专区
工具
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.2K20
  • 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 关键字 , 自动在堆内存中分配内存 , 然后为 堆内存 中的空间赋值

    17010

    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

    89810

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

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

    22110

    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.5K10

    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; // 自定义实现标准异常

    54010

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

    C++ 中的 set 和 map 容器详细总结 1. 概述 C++ 标准模板库(STL)提供了多种关联容器,用于管理键值对和集合的数据。其中,set 和 map 是最常用的两种关联容器。...set 用于存储唯一的元素集合,而 map 则用于存储键值对,其中每个键都是唯一的。它们都使用红黑树(自平衡二叉搜索树)作为底层实现,因此可以提供高效的插入、查找和删除操作。...有序性:set 中的元素默认按升序存储,用户可以自定义排序规则。 高效的查找:set 提供高效的查找、插入和删除操作,时间复杂度为 O(log n)。 自动排序:元素在插入时会自动按顺序排列。...有序性:map 中的键按一定顺序(默认升序)存储,用户可以自定义排序规则。 键值对存储:map 存储的是键值对,每个键映射到一个值。...总结 C++ 中的 set 和 map 容器在数据管理和组织方面非常有用,它们基于红黑树实现,保证了数据的有序性和高效的查找、插入、删除操作。

    9910

    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特化的模板

    40240

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

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

    36220

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

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

    19410

    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.6K30

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

    前言:在C++标准库中,unordered_map和unordered_set作为高效的无序容器,以其基于哈希表的实现方式,为数据的快速查找、插入和删除提供了强有力的支持。...,则为K KeyOfT:通过T来获取key的一个仿函数 HF: 哈希函数仿函数对象类型,哈希函数使用除留余数法,需要将Key转换为整形数字才能 取模 // unordered_setunordered_set...HashTable的迭代器 迭代器基本设计 代码示例(C++): // 为了实现简单,在哈希桶的迭代器中需要用到hashBucket本身,所以我们要进行一下前置声明,并且我们在 HashTable 中也要设置一个友元...Unordered_Set的模拟实现 Unordered_Set的基本设计 代码示例(C++): template> class unordered_set...测试 代码示例(C++): void TestSet() { unordered_set us; us.insert(1); us.insert(2); us.insert(6);

    7510

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

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

    1.5K00

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

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

    54420
    领券