当前位置: 首页 > news >正文

====C++map(映射)的常用用法

====C++map(映射)的常用用法

前提:头文件#include

1.map 的定义

(1)普通定义map

map< type1, type2 > mp ;

(2)嵌套定义map

  1. map套set(一对多,自动去重)

    // 一个key对应一堆不重复元素

    map<string, set<string>> ms;

  2. map套map(二位映射)

    // 二维键值,像二维数组

    map<int, map<int, int>> mm;

map < string, int > mp;

map的键和值也可以是STL容器

type1 键类型:必须是支持比较<> string ,int, set, vector,自定义结构体

type2 值类型

map<set<int>, string> mp;

特点

注!!!

1.键唯一,不能重复!重复会覆盖!

2.自动按键从小到大排序

3.底层:红黑树

map内部是由红黑树实现的(set也是),在建立映射的过程中,会自动实现从小到大排序功能。

4.如果是字符串类型到整型的映射,必须是string而不能是char数组(不能作为键值)

5.访问不存在的键会自动创建 所以使用前一定要判断 if ( mp.count (x) )

map<char, int> mp;` `mp['c'] = 20;` `mp['c'] = 30; //30覆盖了20` `mp['c'] = 666; //666覆盖了30` `cout << mp['c']; //答案输出666

2、map容器内元素的访问

两种访问方式:通过下标访问或通过迭代器访问

(1)通过下标访问:

和普通数组一样

mp['a'] = 100;

cout << mp['a'];

(2)通过迭代器访问:

map < 键类型 , 值类型 > :: iterator 迭代器名;

it->first来访问键

it->second来访问值

for(auto it = mp.begin(); it != mp.end(); it++)

{

cout << it->first << " " << it->second << endl;

}

代码:

#include<iostream>
#include<map>
using namespace std;
int main(){
map<char, int> mp;
mp['a'] = 222;
mp['b'] = 333;
mp['c'] = 444;
for(map<char, int>::iterator it = mp.begin(); it != mp.end(); it++){
cout << it->first;
cout << " ";
cout << it->second;
cout << endl;
}
return 0;
}

输出结果

a 222
b 333
c 444

输入 输出

mp['c'] = 222; a 333
mp['a'] = 333; b 444
mp['b'] = 444; c 222

3、map常用函数

(1)mp.find(key)

auto it = mp.find('a');

#include<iostream>
#include<map>
using namespace std;
int main(){
map<char, int> mp;
mp['a'] = 222;
mp['b'] = 333;
mp['c'] = 444;
map<char, int>::iterator it = mp.find('b');
cout << it->first << " " << it->second;
return 0;
}

(2)mp.erase()

① 删除单个元素:

*mp.erase(it)*it为需要删除的元素的迭代器

#include<iostream>
#include<map>
using namespace std;
int main(){
map<char, int> mp;
mp['a'] = 222;
mp['b'] = 333;
mp['c'] = 444;
map<char, int>::iterator it = mp.find('b');
mp.erase(it);
for(map<char, int>::iterator it = mp.begin(); it != mp.end(); it++){
cout << it->first << " " << it->second << endl;
}
return 0;
}

输出

a 222
c 444

mp.erase(key),key为要删除的映射的键

#include<iostream>
#include<map>
using namespace std;
int main(){
map<char, int> mp;
mp['a'] = 222;
mp['b'] = 333;
mp['c'] = 444;
//map<char, int>::iterator it = mp.find('b');
//mp.erase(it);
mp.erase('b');
for(map<char, int>::iterator it = mp.begin(); it != mp.end(); it++){
cout << it->first << " " << it->second << endl;
}
return 0;
}

输出

a 222
c 444

② 删除一个区间内所有的元素

*mp.erase(first, last)*,其中,first为需要删除的区间的起始迭代器last为需要删除的区间末尾迭代器的下一个地址,即为删除左闭右开的区间[first, last)

#include<iostream>
#include<map>
using namespace std;
int main(){
map<char, int> mp;
mp['a'] = 222;
mp['b'] = 333;
mp['c'] = 444;
map<char, int>::iterator it = mp.find('b');
mp.erase(it, mp.end()); //删除it之后的所有映射,即b 333和 c 444
//mp.erase(it);
//mp.erase('b');
for(map<char, int>::iterator it = mp.begin(); it != mp.end(); it++){
cout << it->first << " " << it->second << endl;
}
return 0;
}

(3)mp.size()

返回键值对数量

(4)mp.count(key)

判断key是否存在

存在返回1 不存在返回0

(5)mp.clear()

清空map

嵌套例题

//B万年沉睡的宝藏
#include<bits/stdc++.h>
#define endl '\n'
#define ll long long
// 输入输出加速
#define IOS ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
using namespace std;

ll q; // 总操作次数
ll op; // 操作编号
string x,y;

int main()
{
IOS; // 开启快读快写,防止超时

cin>>q;
// map:岛屿名 -> 该岛屿拥有的宝藏集合
// set 自动去重,同一个宝藏不会重复统计
map<string ,set<string>>bao;

while(q--)
{
cin>>op;

// 操作1:给岛屿 x 新增一个宝藏 y
if(op==1)
{
cin>>x>>y;
bao[x].insert(y); // 往岛屿x的宝藏集合里加入宝藏y
}

// 操作2:查询岛屿 x 有多少个不同宝藏
if(op==2)
{
cin>>x;
// 如果岛屿不存在,输出0;否则输出宝藏个数
if(!bao.count(x))
{
cout<<0<<endl;
}
else
{
cout<<bao[x].size()<<endl;
}
}

// 操作3:查询岛屿 x 是否拥有宝藏 y
if(op==3)
{
cin>>x>>y;
// 岛屿都不存在,直接输出0
if(!bao.count(x))
{
cout<<0<<endl;
}
else
{
// set.count 有就返回1,没有返回0
cout<<bao[x].count(y)<<endl;
}
}

// 操作4:查询一共有多少个出现过的岛屿
if(op==4)
{
// map.size() 就是岛屿总数
cout<<bao.size()<<endl;
}
}

return 0;
}

http://www.jsqmd.com/news/1249896/

相关文章:

  • 真假?扁桃体炎可能引发肾炎?
  • Claude Code架构解析:七层设计与AI工程实践
  • 2026新余黄金回收白银回收铂金回收价格高无损耗专业鉴定本地人常去门店联系方式推荐
  • TI Cortex-R4F时钟系统与CCM-R4F安全访问机制深度解析
  • 2026 年企业体系认证咨询服务深度评测与选型指南
  • 江诗丹顿中国售后服务中心网点地址与24小时热线实地考察报告_多信源验证(2026年7月更新) - 江诗丹顿服务中心
  • 经典算法实例应用:N叉树的后序遍历(一)
  • AI做会议纪要全链路拆解(从语音转写到行动项提取):实测17款工具后,这4个组合方案真正落地可用
  • 主板后边为什么经常有两个以太网口?第二个网口的4种用法你绝对不知道
  • 深圳夏令营哪家口碑好:军博营地专业靠谱 - 17328623207
  • 2026还在为图片水印烦恼?收藏这几种去水印方法就够了 - 免费软件工具方法教程
  • ICM创芯微 CM1003-BES SOT23-6 BMS电池保护芯片
  • TI C2000 MibSPI与SCI/LIN模块:多缓冲RAM与硬件协议引擎深度解析
  • 深入解析TI C2000 eQEP模块:正交编码器高精度位置与速度检测实战
  • VUE3实现语音播报
  • 重庆主城劳力士回收,九龙坡万象城门店出价更实在 - 融媒生活
  • 在自动化脚本中如何操作excel文件?
  • OpenWrt 23.05.3 软路由美化与功能扩展:Argon主题+Docker+iStore一站式配置记录
  • OpenAI 昨天卖「可信 Agent」,今天承认模型越狱——Presence 的信任赤字有多大?
  • 深圳夏令营哪家性价比高:军博营地服务优质 - 17728098551
  • 一个宏在调试阶段挡住所有误操作
  • 华为CANN模型部署与model-zoo优化技术解析
  • 学生工作管理系统用户手册:操作指南与功能详解
  • 提示工程监控预警系统设计与实战
  • 2026 年更新:黔南州诚信的防爆板实力厂家竞争格局,不防爆板如何拯救你的工厂? - 企业官方推荐【认证】
  • 保姆级教程:给吃灰的小米AC2100刷入原生OpenWrt,打造稳定轻量的软路由
  • TI C2000 eCAP模块深度解析:从捕获到PWM生成的实战指南
  • 嵌入式系统EMIF接口详解:SDRAM与异步存储器的配置与调试实战
  • 抖音礼物模拟器-无限礼物
  • 2026年 山东潍坊漆/烤漆/环氧漆/工业漆生产厂家:山东庞贝捷新材料有限公司 - 品牌发掘