【C++中map和unordered_map存储自定义类型需要做什么】

news2024/11/15 17:25:57

目录

一、map存储自定义类型

 二、unordered_map存储自定义类型


一、map存储自定义类型

 需要传入的参数是key-value键值对,和仿函数类型

 对于内置类型,int、double、char重载了operator<所以传入less仿函数不会出错

但是对于自定义类型,如果不重载operator<就会出错

比如下面:传入自定义类型直接报错


#include <map>
#include <iostream>

class Person
{
public:
	int _age;

	Person(int age = -1) :_age(age)
	{}
};

int main()
{
	std::map<Person, int> um;
	um.insert(std::make_pair<Person, int>(Person(1), 1));
	um.insert(std::make_pair<Person, int>(Person(2), 1));

	for (auto& e : um)
	{
		std::cout << e.first._age << " " << e.second << std::endl;
	}
	return 0;
}

存储自定义类型进行传参的两种方法:

方法一:重载operator<


#include <map>
#include <iostream>

class Person
{
public:
	int _age;

	Person(int age = -1) :_age(age)
	{}

	// 重载operator<
	bool operator<(const Person& p) const
	{
		return _age < p._age;
	}
};

int main()
{
	std::map<Person, int> um;
	um.insert(std::make_pair<Person, int>(Person(1), 1));
	um.insert(std::make_pair<Person, int>(Person(2), 1));

	for (auto& e : um)
	{
		std::cout << e.first._age << ":" <<  e.second << std::endl;
	}

	return 0;
}

 方法二:自己定义比较规则:传入仿函数类型


#include <map>
#include <iostream>

class Person
{
public:
	int _age;

	Person(int age = -1):_age(age)
	{}
};

class PersonCmp
{
public:
	bool operator()(const Person& p1, const Person& p2) const
	{
		return p1._age < p2._age;
	}
};

int main()
{
	// 自定定义一个仿函数比较规则
	std::map<Person, int, PersonCmp> um;
	um.insert(std::make_pair<Person, int>(Person(1), 1));
	um.insert(std::make_pair<Person, int>(Person(2), 1));

	for (auto& e : um)
	{
		std::cout << e.first._age <<  " " << e.second << std::endl;
	}
	return 0;
}

 二、unordered_map存储自定义类型

 第一个参数:传入key值

第二个参数:传入T值

第三个参数哈希函数

对于内置类型支持可以支持哈希函数

 

 

第四个参数key的比较方式

对于内置类型是重载了比较方式的

 传入自定义类型什么也不做:
 


#include <iostream>
#include <unordered_map>

class Person
{
public:
	int _age;

	Person(int age = -1) :_age(age)
	{}
};

int main()
{
	std::unordered_map<Person, int> um;
	um.insert(std::make_pair<Person, int>(Person(1), 1));
	um.insert(std::make_pair<Person, int>(Person(2), 1));

	for (auto& e : um)
	{
		std::cout << e.first._age << " " << e.second << std::endl;
	}
	return 0;
}

 这个是会出问题的,重载operator ==,因为哈希表需要按照key进行查找,需要进行比较

以及定义哈希函数,因为没有系统的hash函数没有对自定义类型进行哈希

方法一:自定义类中重载operator == 和自定义hash函数,不传入第四个参数


#include <iostream>
#include <unordered_map>
#include <functional>

class Person
{
public:
	int _age;

	Person(int age = -1) :_age(age)
	{}

	bool operator == (const Person& p) const
	{
		return _age == p._age;
	}
};

struct PersonHash
{
public:
	size_t operator()(const Person& p) const
	{
		return std::hash<int>()(p._age);
	}
};

int main()
{
	std::unordered_map<Person, int, PersonHash> um;
	um.insert(std::make_pair<Person, int>(Person(1), 1));
	um.insert(std::make_pair<Person, int>(Person(2), 1));

	for (auto& e : um)
	{
		std::cout << e.first._age << " " << e.second << std::endl;
	}
	return 0;
}

 

 方法二:自定义hash函数和自定义key的比较规则


#include <iostream>
#include <unordered_map>
#include <functional>

class Person
{
public:
	int _age;

	Person(int age = -1) :_age(age)
	{}
};

struct PersonHash
{
public:
	size_t operator()(const Person& p) const
	{
		return std::hash<int>()(p._age);
	}
};

struct PersonEqual
{
public:
	bool operator()(const Person& p1, const Person& p2) const
	{
		return p1._age < p2._age;
	}
};

int main()
{
	std::unordered_map<Person, int, PersonHash, PersonEqual> um;
	um.insert(std::make_pair<Person, int>(Person(1), 1));
	um.insert(std::make_pair<Person, int>(Person(2), 1));

	for (auto& e : um)
	{
		std::cout << e.first._age << " " << e.second << std::endl;
	}
	return 0;
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/594266.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MySQL 视图 浅入浅出

前提 最近公司接了一个项目&#xff0c;项目是将一份内容丰富且包含大量数据透视表&#xff08;之所以称为数据透视表&#xff0c;是因为可以动态地改变它们的版面布置&#xff0c;以便按照不同方式分析数据&#xff0c;也可以重新安排行号、列标和页字段。每一次改变版面布置…

搭建一个AI对话机器人——前端ChatUI使用纪录

最近在使用 OpenAI 的 gpt api 搞着玩玩&#xff0c;然后就遇上了前端对话交互实现的需求场景&#xff0c;如何快速实现 CUI&#xff08;Chat User Interface&#xff09;成了问题。最后选择了来自阿里达摩院的ChatUI&#xff0c;本人便用于整理其使用经验。 介绍 服务于对话领…

自动驾驶 | 使用机器学习方法的GNSS多径检测

来源&#xff1a;投稿 作者&#xff1a;小灰灰 编辑&#xff1a;学姐 论文标题&#xff1a;GNSS Multipath Detection Using a Machine Learning Approach 论文链接&#xff1a;https://ieeexplore.ieee.org/stamp/stamp.jsp?tp&arnumber8317700 摘要 在高度城市化地区…

Yolov8轻量化:EMO,结合 CNN 和 Transformer 的现代倒残差移动模块设计,性能优于EdgeViT、Mobile-former等网络

论文: https://arxiv.org/pdf/2301.01146.pdf 🏆🏆🏆🏆🏆🏆Yolo轻量化模型🏆🏆🏆🏆🏆🏆 重新思考了 MobileNetv2 中高效的倒残差模块 Inverted Residual Block 和 ViT 中的有效 Transformer 的本质统一,归纳抽象了 MetaMobile Block 的一般…

JAVA基础JVM讲解

JVM体系结构 主要包括两个子系统和两个组件&#xff1a; Class loader(类装载器) 子系统&#xff08;用来装载.class文件&#xff09;; Execution engine(执行引擎) 子系统&#xff08;执行字节码&#xff0c;或者执行本地方法&#xff09;&#xff1b; Runtime data area (…

2023年6月18日DAMA-CDGA/CDGP数据治理认证报名指南

DAMA认证为数据管理专业人士提供职业目标晋升规划&#xff0c;彰显了职业发展里程碑及发展阶梯定义&#xff0c;帮助数据管理从业人士获得企业数字化转型战略下的必备职业能力&#xff0c;促进开展工作实践应用及实际问题解决&#xff0c;形成企业所需的新数字经济下的核心职业…

弹性及其应用

弹性 衡量了买者和卖者对市场环境变化作出反应的程度大小是我们能够更精确的分析供给和需求 需求的价格弹性 给定百分之一的价格变化&#xff0c;需求量变量的百分数就是需求的价格弹性它衡量了一种物品的需求量对该物品价格变化作出反应的程度大小 需求价格弹性的决定因素…

手把手教你搭建OpenStack云平台(超级详细)

一、前言 OpenStack云平台搭建需要两个节点&#xff0c;一个是controller&#xff08;控制节点&#xff09;&#xff0c;另一个是compute&#xff08;计算节点&#xff09;。 控制节点&#xff08;controller&#xff09;规划如下&#xff1a; 一块200G的硬盘。两块网卡&#x…

天地图下载数据的方法

天地图下载数据的方法&#xff0c;目前我知道的&#xff0c;部分数据可以下载&#xff0c;部分数据不提供下载&#xff08;但是有数据&#xff09;具体就不知道原因了&#xff0c;话不多说&#xff1a; 登录全国地理信息资源目录服务系统&#xff08;全国地理信息资源目录服务…

cuda编程

https://docs.nvidia.com/cuda/index.html 这里写目录标题 OpenCL 与OpenGlrelease noteCUDA Features Archivensight visual studio安装指导本地下载和网络下载 bili 视频1c2050 版本Fermi架构3接口延迟cpu逻辑控制&#xff0c;管理 GPU计算核心连接 GPU硬件架构综述架构2atom…

Revit中如何使创建的族文件内存变小

族文件的大小直接影响到项目文件的大小和软件运行速度&#xff0c;如何将族文件做的最小并且满足项目需求呢? 方法一&#xff1a;清除未使用项 1. 族制作完成可以把族文件中未用到的外部载入族或其他多余数据删掉&#xff0c;点击“管理”选项卡下拉的“清除未使用项”命令; 2…

我拒绝了字节的offer,给求职者提个醒....

我大学学的是计算机专业&#xff0c;毕业的时候&#xff0c;对于找工作比较迷茫&#xff0c;也不知道当时怎么想的&#xff0c;一头就扎进了一家外包公司&#xff0c;一干就是2年。我想说的是&#xff0c;但凡有点机会&#xff0c;千万别去外包&#xff01; 在深思熟虑过后&am…

LabVIEWCompactRIO 开发指南第七章45 将I/O添加到Compact RIO

LabVIEWCompactRIO 开发指南第七章45 将I/O添加到Compact RIO 基于LabVIEW可重配置I/O&#xff08;RIO&#xff09;架构的NI产品日益被采用用于需要高通道数、密集处理和分布式I/O的系统级应用。将RIO扩展I/O添加到NI RIO产品产品中&#xff0c;可实现1&#xff1a;N系统拓扑…

源码分析 | MySQL 的 commit 是怎么 commit 的?

作者&#xff1a;李鹏博 爱可生 DBA 团队成员&#xff0c;主要负责 MySQL 故障处理和 SQL 审核优化。对技术执着&#xff0c;为客户负责。 本文来源&#xff1a;原创投稿 爱可生开源社区出品&#xff0c;原创内容未经授权不得随意使用&#xff0c;转载请联系小编并注明来源。 …

JavaEE进阶(Mybatis)5/30

目录 1.单元测试 2.生成单元测试 3.Mybatis 插入操作 4.#{}和${}的区别 1.单元测试 优点&#xff0c;1.可以检查方法的正确性 2.可以&#xff0c;在打包前检查程序的错误&#xff0c;减少错误 3.不污染数据库 2.生成单元测试 1.要生成的类内部generate 2.添加单元测试的代码…

5.31串讲Spring、Vue相关问题

5.31串讲 SSM相关问题 文章目录 5.31串讲 SSM相关问题Spring Security&#xff08;Shiro&#xff09;Security框架认证流程Security流程图展示 Vue相关指令四个阶段 axios Spring Security&#xff08;Shiro&#xff09; Spring Security是一个基于Spring 的安全框架&#xff…

高压放大器怎么驱动超声波探头的

高压放大器是超声波探头中的关键部分&#xff0c;它主要用于放大发射信号和接收信号。在超声波成像过程中&#xff0c;发射信号需要经过高压放大器的放大后才能刺激探头产生超声波&#xff0c;并且接受到的超声波也需要通过高压放大器进行放大处理。因此&#xff0c;高压放大器…

ChatGPT正式登陆iOS平台

6天前&#xff0c;ChatGPT在美区App Store中上架了官方App&#xff0c;累计下载量已经突破 50 万次&#xff0c;OpenAI 的 ChatGPT 应用在上架之后&#xff0c;其热度远超必应聊天等聊天机器人&#xff0c;以及其它使用 GPT-4 的第三方应用。 3.5是免费的&#xff0c;GPT4是收…

【大数据之Hive】五、Hiveserver2服务部署

hiveserver2服务 hiveserver2提供JDBC/ODBC接口&#xff0c;使得用户可以远程访问Hive数据&#xff0c;即作为客户端的代理与Hadoop集群进行交互。 hiveserver2部署时需要部署到一个能访问集群的节点上&#xff0c;保证能够直接往Hadoop上提交数据。   用户在客户端提交SQL语…

8个免费UI图标网站,任何设计师都不该错过

图标是网页设计和应用程序界面设计中不可缺少的一部分。但在日常工作中&#xff0c;许多设计师每次都需要设计一套特定的图标&#xff0c;但他们不知道在哪里获得高质量的UI图标素材。 本文推荐8个宝藏级UI图标完整资源网站&#xff0c;免费&#xff0c;建议迅速收集以备不时之…