C++学习 --map
目录
1, 什么是map
2, 创建map
2-1, 标准数据类型
2-2, 自定义数据类型
2-3, 其他创建方式
3, 操作map
3-1, 赋值
3-2, 插入元素(insert)
3-2-1, 插入标准数据类型
3-2-1, 插入自定义数据类型
3-3, 查询元素
3-3-1, 标准数据类型查询
3-3-1-1,迭代器访问
3-3-1-2, 键访问
3-3-2, 自定义数据类型查询
3-3-2-1, 迭代器访问
3-3-2-2, 键访问
3-4, 移除元素
3-4-1, 通过键移除
3-4-2, 通过迭代器移除
3-5, 清空
3-6, 获取长度
3-7, 查找元素
3-8, 判断map是否为空
3-9, 统计键数量
3-10, map互换
4, multimap
1, 什么是map
map中存储的元素是pair, 元素会根据pair的key自动升序排序, 通过key快速找到对应的value
分为map和multimap两种, 前者不允许key重复, 后者允许key重复
由于不是标准数据类型, 需要包含头文件#include <map>才能使用
2, 创建map
通过map<数据类型, 数据类型> 对象名, 可创建map, 数据类型可以是标准数据类型, 也可以是自定义类型
2-1, 标准数据类型
//map中元素键数据类型为string, 值数据类型为int
map<string, int> m1;
2-2, 自定义数据类型
Myclass1 mc_1("张三", 10);
Myclass2 mc_2("李四", 20);
//map中元素键数据类型为MyClass, 值数据类型为MyClass2
map<Myclass1, Myclass2> m1;
2-3, 其他创建方式
//通过拷贝构造方式, 将一个已存在的m1, 拷贝给m2
map<string, int> m2(m1);
//通过迭代器方式, 将一个已存在的m1, 拷贝给m2
//m1.begin()指向m1的第一个元素, m1.begin()指向m1的最后一个元素的下一个元素
map<string, int> m3(m1.begin(), m1.end());
3, 操作map
3-1, 赋值
由于map是一个容器, 只支持将一个map赋值给另外一个map
map<string, int> m1;
map<string, int> m2;
m2 = m1;
3-2, 插入元素(insert)
通过对象名.insert(pair对象), 向map中插入元素, 不支持虚插(push_back)
3-2-1, 插入标准数据类型
map<string, int> m1;
//下面三种都可以插入数据
//注意:只能插入pair对象
m1.insert(pair<string, int>("aaa", 1));
m1.insert(make_pair("bbb", 2));
m1.insert(map<string, int>::value_type("ccc", 3));
3-2-1, 插入自定义数据类型
//重定义仿函数, 注意后面加了const,是个常函数
class MyCompare
{
public:bool operator()(const Myclass1& m1, const Myclass1& m2) const{return m1.m_name > m2.m_name;}
};Myclass1 mc_1("aaa", 1);
Myclass2 mc_2("bbb", 2);
//由于key值是自定义数据类型,这里需要重定义仿函数, 数据加上MyCompare
map<Myclass1, Myclass2, MyCompare> m1;
//下面三种都可以插入数据
//注意:只能插入pair对象
m1.insert(pair<Myclass1, Myclass2>(mc_1, mc_2));
m1.insert(make_pair(mc_1, mc_2));
m1.insert(map<Myclass1, Myclass2>::value_type(mc_1, mc_2));
3-3, 查询元素
可通过迭代器或者对象名[key]的方式
3-3-1, 标准数据类型查询
3-3-1-1,迭代器访问
#include <iostream>
#include <string>
#include <map>using namespace std;void print_map(map<string, int>& m)
{for (map<string, int>::iterator it = m.begin(); it != m.end(); it++){cout << "键:" << it->first << " " << "值:" << it->second << endl;}
}int main()
{map<string, int> m1;//下面三种都可以插入数据//注意:只能插入pair对象m1.insert(pair<string, int>("aaa", 111));m1.insert(make_pair("bbb", 222));m1.insert(map<string, int>::value_type("ccc", 333));print_map(m1);system("pause");return 0;
}
3-3-1-2, 键访问
#include <iostream>
#include <string>
#include <map>using namespace std;int main()
{map<string, int> m1;//下面三种都可以插入数据//注意:只能插入pair对象m1.insert(pair<string, int>("aaa", 111));m1.insert(make_pair("bbb", 222));m1.insert(map<string, int>::value_type("ccc", 333));cout << "通过键获取元素:" << m1["aaa"] << endl;system("pause");return 0;
}
3-3-2, 自定义数据类型查询
3-3-2-1, 迭代器访问
#include <iostream>
#include <string>
#include <map>using namespace std;class Myclass1
{
public:Myclass1(string name, int age) : m_name(name), m_age(age) {};string m_name;int m_age;
};class Myclass2
{
public:Myclass2(string name, int age) : m_name(name), m_age(age) {};string m_name;int m_age;
};//仿函数重载
class MyCompare
{
public:bool operator()(const Myclass1& m1, const Myclass1& m2) const{return m1.m_name < m2.m_name;}
};//注意map中加上了MyCompare
void print_map_1(map<Myclass1, Myclass2, MyCompare>& m)
{for (map<Myclass1, Myclass2, MyCompare>::iterator it = m.begin(); it != m.end(); it++){cout << "键:" << it->first.m_name << " " << it->first.m_age << endl;cout << "值:" << it->second.m_name << " " << it->first.m_age << endl;}
}int main()
{Myclass1 mc_1("aaa", 1);Myclass2 mc_2("bbb", 2);Myclass1 mc_3("ccc", 3);Myclass2 mc_4("ddd", 4);Myclass1 mc_5("eee", 5);Myclass2 mc_6("fff", 6);//由于key值是自定义数据类型,这里需要重定义仿函数, 数据加上MyComparemap<Myclass1, Myclass2, MyCompare> m1;//下面三种都可以插入数据//注意:只能插入pair对象m1.insert(pair<Myclass1, Myclass2>(mc_1, mc_2));m1.insert(make_pair(mc_3, mc_4));m1.insert(map<Myclass1, Myclass2>::value_type(mc_5, mc_6));print_map_1(m1);system("pause");return 0;
}
3-3-2-2, 键访问
在已知键的情况下, 通过对象名[键], 获取元素
#include <iostream>
#include <string>
#include <map>using namespace std;class Myclass1
{
public://通过键获取元素,需定义默认构造函数:Myclass1() {}Myclass1() {};Myclass1(string name, int age) : m_name(name), m_age(age) {};string m_name;int m_age;
};class Myclass2
{
public://通过键获取元素,需定义默认构造函数:Myclass1() {}Myclass2() {};Myclass2(string name, int age) : m_name(name), m_age(age) {};string m_name;int m_age;
};//仿函数重载
class MyCompare
{
public:bool operator()(const Myclass1& m1, const Myclass1& m2) const{return m1.m_name < m2.m_name;}
};int main()
{Myclass1 mc_1("aaa", 1);Myclass2 mc_2("bbb", 2);Myclass1 mc_3("ccc", 3);Myclass2 mc_4("ddd", 4);Myclass1 mc_5("eee", 5);Myclass2 mc_6("fff", 6);//由于key值是自定义数据类型,这里需要重定义仿函数, 数据加上MyComparemap<Myclass1, Myclass2, MyCompare> m1;//下面三种都可以插入数据//注意:只能插入pair对象m1.insert(pair<Myclass1, Myclass2>(mc_1, mc_2));m1.insert(make_pair(mc_3, mc_4));m1.insert(map<Myclass1, Myclass2>::value_type(mc_5, mc_6));//通过键访问cout << "通过键获取元素:" << m1[mc_3].m_name << " " << m1[mc_3].m_age << endl;system("pause");return 0;
}
3-4, 移除元素(erase)
3-4-1, 通过键移除
通过对象名.erase(键), 指定从map中移除元素
m1.erase("bbb");
3-4-2, 通过迭代器移除
通过对象名.erase(迭代器), 指定从map中移除元素
map<string, int>::iterator it = m1.begin();
//移动迭代器的位置
it = it++;
m1.erase(it);
3-5, 清空(clear)
通过对象名.clear(), 清空map中的元素
m1.clear();
//通过指定迭代器区间进行清空
m1.erase(m1.begin(), m1.end());
3-6, 获取长度(size)
通过对象名.size(), 获取map的元素个数
m1.size();
3-7, 查找元素(find)
通过对象名.find(键), 查找map中是否在存在元素, 存在返回对应iterator, 不存在返回对象名.end()
//存在返回对应的iterator
map<string, int>::iterator ret = m1.find("aaa");if (ret != m1.end())
{cout << "键:" << ret->first << " 值:" << ret->second << endl;
}
else
{cout << "查找的键不存在" << endl;
}
3-8, 判断map是否为空(empty)
通过对象名.empty(), 判断map是否为空, 为空返回1, 不为空返回0;
m1.empty();
3-9, 统计键数量(count)
通过对象名.count(键), 统计map中指定的键的个数,要么为1,要么为0
m1.count("aaa");
3-10, map互换(swap)
通过对象名1.swap(对象名2), 可交换两个map的元素
m1.swap(m2);
4, multimap
通过multimap<数据类型, 数据类型> 对象名, 创建multimap, multimap支持键重复
#include <iostream>
#include <string>
#include <map>using namespace std;void print_map(multimap<string, int>& m)
{for (multimap<string, int>::iterator it = m.begin(); it != m.end(); it++){cout << "键:" << it->first << " " << "值:" << it->second << endl;}
}int main()
{multimap<string, int> mul_m1;mul_m1.insert(make_pair("aaa", 111));mul_m1.insert(make_pair("aaa", 112));mul_m1.insert(make_pair("aaa", 113));print_map(mul_m1);system("pause");return 0;
}
相关文章:

C++学习 --map
目录 1, 什么是map 2, 创建map 2-1, 标准数据类型 2-2, 自定义数据类型 2-3, 其他创建方式 3, 操作map 3-1, 赋值 3-2, 插入元素(insert) 3-2-1, 插入标准数据类…...

基于Qt QList和QMap容器类示例
## QList<T> QList<T>容器是一个数组列表,特点如下: 1.大多数情况下可以用QList。像prepend()、append()和insert()这种操作,通常QList比QVector快的多。这是因为QList是基于index标签存储它的元素项在内存中(虽然内存不连续,这点与STL的list 是一样的),比…...

Flask学习一:概述
搭建项目 安装框架 pip install Flask第一个程序 from flask import Flaskapp Flask(__name__)app.route(/) def hello_world():return "Hello World"if __name__ __main__:app.run()怎么说呢,感觉还不错的样子。 调试模式 if __name__ __main__:a…...

LeetCode:689. 三个无重叠子数组的最大和(dp C++)
目录 689. 三个无重叠子数组的最大和 题目描述: 实现代码与解析: dp 原理思路: 滑动窗口: 原理思路: 689. 三个无重叠子数组的最大和 题目描述: 给你一个整数数组 nums 和一个整数 k ,找…...

Leetcode—206.反转链表【简单】
2023每日刷题(三十三) Leetcode—206.反转链表 头插法实现代码 /*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/ struct ListNode* reverseList(struct ListNode* head) {if(head NULL…...

Linux - 内存 - 预留内存占用分析
说明 Linux启动log中会显示平台的内存信息,公司SOC平台,物理DRAM实际size是128M,但是启动log中total size不足128MB,并且预留内存(82272K reserved)过多,启动log如下: Memory: 480…...

Java学习之路 —— Java高级
文章目录 前言1. 单元测试2. 反射2.1 获取Class对象的三种方式2.2 获取类的构造器的方法2.3 获取类的成员变量2.4 获取类的成员方法2.5 反射的作用 3. 注解3.1 自定义注解3.2 注解的原理3.3 元注解3.4 注解的解析 4. 动态代理5. 总结 前言 终于走到新手村的末端了,…...

git使用及常用命令
在初入公司中,若使用的是git管理工具,需要做以下步骤: 1,常用命令在: (1),git config --global user.name xxx(名字) //若不设置 那么下次提交代码时会报错 其次该设置名字和…...

vue 学习 -- day36(分析工程结构)
//引入的不再是Vue构造函数了,引入的是一个名为createApp的工厂函数 import { createApp } from vue import App from ./App.vue //创建应用实例对象——app(类似于之前Vue2中的vm,但app比vm更“轻”,它少了很多属性和方法) const app creat…...

SQL Injection
SQL Injection SQL injection(SQL注入),通过在输入字段或URL查询参数中执行SQL命令,导致对数据库的未经授权的访问。如果SQL注入成功,未经授权的人可能会读取、创建、更新甚至删除数据库表的记录 举个例子:…...

【Go入门】 Go搭建一个Web服务器
【Go入门】 Go搭建一个Web服务器 前面小节已经介绍了Web是基于http协议的一个服务,Go语言里面提供了一个完善的net/http包,通过http包可以很方便的搭建起来一个可以运行的Web服务。同时使用这个包能很简单地对Web的路由,静态文件,…...

VS 将 localhost访问改为ip访问
项目场景: 使用vs进行本地调试时需要多人访问界面,使用ip访问报错 问题描述 vs通过ip访问报错 虚拟机或其它电脑不能正常打开 原因分析: 原因是vs访问规则默认是iis,固定默认启动地址是localhost 解决方案: 1.vs项目启动之后会出现这个 右…...

app使用
font-face{font-family:‘kaishu’; src: url(data:application/font-ttf;charsetutf-8;base64,AAEAAAASAQAABAAgRFNJR5PpVzIAAAEsAAAacEdTVUIzhvftAAAbnAAAAXBPUy8yY8pHoQAAHQwAAABWY21hcAsTB9YAAB1kAADD5GN2dCAvAiIAADhSAAAA5pmcGdt/siFHQAA5OQAAAOiZ2FzcAAXAAkAAOiIAAAAEGds…...

【迅搜01】安装运行并测试XunSearch
安装运行并测试XunSearch 这回的新系列,我们将学习到的是一个搜索引擎 迅搜 XunSearch 的使用。这个搜索引擎在 PHP 圈可能还是有一点名气的,而且也是一直在更新的,虽说现在 ElasticSearch 已经是实际上的搜索引擎霸主了,而且还有…...

Mac电脑VSCode配置PHP开发环境
1.安装 PHP 首先,打开终端,安装 Homebrew,输入如下命令: $ /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" 安装了 Homebrew 之后,你可以使用下面的…...

SpirngBoot + Vue 前后端分离开发工具代码
✅作者简介:大家好,我是Leo,热爱Java后端开发者,一个想要与大家共同进步的男人😉😉 🍎个人主页:Leo的博客 💞当前专栏: Java从入门到精通 ✨特色专栏…...

【数据结构初阶】单链表(附全部码源)
单链表 1,单链表的概念及结构2,单链表的实现2.1初始化内容(所需文件,接口)2.2申请结点2.3打印单链表2.4尾插2.5头插2.6尾删2.7头删2.8查找2.9在pos位置之后插入2.10在pos位置前面插入2.11删除pos之后的值2.12删除pos位…...

数据治理入门
处理模式 模式名称常见场景常见框架批处理夜间几个小时,无人值守hive spark datax流处理7*24H一直运行,无人值守maxwell, flink, flume, kafka即席处理人机交互接口访问 web页面 数据治理的意义 数据质量低:数据错误,不准确或不…...

uniapp 微信小程序登录 新手专用 引入即可
预览 第一步导入插件 在引入的页面的登录按钮下拷贝一下代码 <template><view class"content"><button type"primary" click"login">微信登录</button></view><TC-WXlogin :wxloginwxlogin /> </templ…...

PMCW体制雷达系列文章(4) – PMCW雷达之抗干扰
说明 本文作为PMCW体制雷达系列文章之一,主要聊聊FMCW&PMCW两种体制雷达的干扰问题。事实上不管是通信领域还是雷达领域,对于一切以电磁波作为媒介的信息传递活动,干扰是无处不在的。近年来,随着雷达装车率的提高,…...

Gin框架源码解析
概要 目录 Gin路由详解 Gin框架路由之Radix Tree 一、路由树节点 二、请求方法树 三、路由注册以及匹配 中间件含义 Gin框架中的中间件 主要讲述Gin框架路由和中间件的详细解释。本文章将从Radix树(基数树或者压缩前缀树)、请求处理、路由方法树…...

MacOS设置JAVA_HOME环境变量
首先先查看一下,系统当前使用的java是谁,可以使用/usr/libexec/java_home命令 % /usr/libexec/java_home /Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Home检查一下这个路径下的文件,发现这是一个jre的目录。加上-V参数看…...
闭眼检测实现
引言 这段代码是一个实时眼睛状态监测程序,可以用于监测摄像头捕获的人脸图像中的眼睛状态,判断眼睛是否闭合。具体应用实现作用说明如下: 1. 实时监测眼睛状态 通过摄像头捕获的实时视频流,检测人脸关键点并计算眼睛的 EAR&a…...

系列六、Java垃圾回收器主要有哪些?
一、Java垃圾回收器主要有哪些? UseSerialGC、UseParallelGC、UseConcMarkSweepGC、UseParallelNewGC、UseParallelOldGC、UseG1GC...

【7】Spring Boot 3 集成组件:缓存组件 spring cache + spring data redis
目录 【7】Spring Boot 3 集成组件:缓存组件 spring cache spring data redis什么是缓存抽象声明式注解JSR-107对应SpEL上下文数据 引入依赖cache 支持的缓存类型缓存类型配置NONESIMPLEREDIS自定义配置 CAFFEINE Hazelcast...总结 个人主页: 【⭐️个人主页】 需要…...

说说Java中的不可重入锁
什么是锁? 简单来讲在Java中,锁是一种用于并发控制的机制,用于保护共享资源,防止多个线程同时访问或修改数据导致的数据不一致性和线程安全问题。在Java虚拟机(JVM)中,每个对象都有一个相关联的…...

C++学习 --vector
目录 1, 什么是vector 2, 创建vector 2-1, 标准数据类型 2-2, 自定义数据类型 2-3, 其他创建方式 3, 操作vector 3-1, 赋值 3-2, 添加元素 3-2-1, 添加元素(assi…...
Android图片涂鸦,Kotlin(1)
Android图片涂鸦,Kotlin(1) import android.content.Context import android.graphics.Canvas import android.graphics.Color import android.graphics.Paint import android.graphics.Path import android.graphics.PointF import android.…...

upload-labs(1-17关攻略详解)
upload-labs pass-1 上传一个php文件,发现不行 但是这回显是个前端显示,直接禁用js然后上传 f12禁用 再次上传,成功 右键打开该图像 即为位置,使用蚁剑连接 连接成功 pass-2 源码 $is_upload false; $msg null; if (isse…...

《 机器人基础 》期末试卷(A)
一、填空题(30分,每空2分) 1. 按照相机的工作方式,机器人常用相机分为1)__ 单目摄像头 2)__ 双目摄像头 _ 3)_深度摄像头_ 三类。 2. 度量地图强调…...