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

news/2025/3/20 6:35:54/

目录

一、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.ppmy.cn/news/126043.html

相关文章

云原生:从基本概念到实践,解析演进与现状

文章目录 云原生&#xff1a;从基本概念到实践&#xff0c;解析演进与现状概念演进之路DockerKubernetesCloud NativeServerless 业界现状总结 结语 云原生&#xff1a;从基本概念到实践&#xff0c;解析演进与现状 本文仅用于简单普及&#xff0c;达到的目的是给没接触过或者很…

4600php,4600万像素DC 适马DP1 Merrill报6980元

SIGMA DP1 Merrill采用了23.515.7mm全彩色的Foveon X3全色影像感侧器“Merrill”,拥有4600万像素(4,8003,2003层)和44个记录百万像素(4,7043,1363层)&#xff0c;本周合作经销商对这台机器的报价为6980元(含税)。 SIGMA DP1 Merrill SIGMA DP1 Merrill具备高性能的广角19mm F2.…

状态DP1

初步认知&#xff0c;有些东西需要集合来表示但是不太方便 比如说00010001000100001 又1的地方就代表这个数在这个集合中存在&#xff0c;于是乎我们就可以用一个数字表示一个集合了。 例题 旅行商问题 #include<iostream> #include<cstring> #include<algo…

MySQL 视图 浅入浅出

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

动态规划 -- 213. 打家劫舍 II

力扣 你是一个专业的小偷&#xff0c;计划偷窃沿街的房屋&#xff0c;每间房内都藏有一定的现金。这个地方所有的房屋都 围成一圈 &#xff0c;这意味着第一个房屋和最后一个房屋是紧挨着的。同时&#xff0c;相邻的房屋装有相互连通的防盗系统&#xff0c;如果两间相邻的房屋…

[kuangbin带你飞] 基础DP1 题集

可点击查看每道题的解题博客链接 A - Max Sum Plus Plus B - Ignatius and the Princess IV C - Monkey and Banana

Weak 4 kuangbin 算法作业 基础DP1

基础DP1: 1.HDU 1024 Max Sum Plus Plus 2.HDU 1029 Ignatius and the Princess IV 3.HDU 1069 Monkey and Banana 4.HDU 1176 免费馅饼 5.HDU 1260 Tickets 6.HDU 1257 最少拦截系统

Type-c检测之正反插与DP lane的交换

大家好&#xff0c;我是PD协议小白&#xff0c;我在pd简介中简单的介绍了一下type-c内部结构以及角色问题&#xff0c;那我们如何去检测typc-c的正反插以及判断lane的线序呢&#xff1f;那么本文我带大家讨论一下吧&#xff0c;如果我又说的不对的地方&#xff0c;欢迎大家给予…