map 详解(C++)

2023-05-16

现实中的数据很多是关联的,例如书本名称和价格,每条数据都含有两部分:

信息学竞赛一本通 :¥80
高等数学 :¥27.5
生物信息分析 :¥35.5

我们可以使用map存储这类一对一的数据:

第一个可以称为关键字(key),每个关键字只能在map中出现一次;
第二个可能称为该关键字的值(value);

另外需要注意的是,使用 map 容器存储的各个键-值对,键的值既不能重复也不能被修改。换句话说,map 容器中存储的各个键值对不仅键的值独一无二,键的类型也会用 const 修饰,这意味着只要键值对被存储到 map 容器中,其键的值将不能再做任何修改。

1.头文件

#include <map>
using namespace std;

2.初始化

std::map<std::string, int>myMap;
std::map<std::string, int>myMap{ {"C语言教程",10},{"STL教程",20} };//myMap 容器在初始状态下,就包含有 2 个键值对。

再次强调,map 容器中存储的键值对,其本质都是 pair 类模板创建的 pair 对象。因此,下面程序也可以创建出一模一样的 myMap 容器:

std::map<std::string, int>myMap{std::make_pair("C语言教程",10),std::make_pair("STL教程",20)};

3.插入元素

C++ STL map 类模板中对[ ]运算符进行了重载,即根据使用场景的不同,借助[ ]运算符可以实现不同的操作。举个例子

#include <iostream>
#include <map>  //map
#include <string> //string
using namespace std;
int main()
{
    std::map<string, string> mymap{ {"STL教程","http://c.biancheng.net/java/"} };
    //获取已存储键值对中,指定键对应的值
    cout << mymap["STL教程"] << endl;

    //向 map 容器添加新键值对
    mymap["Python教程"] = "http://c.biancheng.net/python/";

    //修改 map 容器已存储键值对中,指定键对应的值
    mymap["STL教程"] = "http://c.biancheng.net/stl/";

    for (auto iter = mymap.begin(); iter != mymap.end(); ++iter) {
        cout << iter->first << " " << iter->second << endl;
    }
   
    return 0;
}

程序执行结果为:

http://c.biancheng.net/java/
Python教程 http://c.biancheng.net/python/
STL教程 http://c.biancheng.net/stl/

可以看到,当操作对象为 map 容器中已存储的键值对时,则借助 [ ] 运算符,既可以获取指定键对应的值,还能对指定键对应的值进行修改;反之,若 map 容器内部没有存储以 [ ] 运算符内指定数据为键的键值对,则使用 [ ] 运算符会向当前 map 容器中添加一个新的键值对。

4.获取元素

map 类模板中对[ ]运算符进行了重载,这意味着,类似于借助数组下标可以直接访问数组中元素,通过指定的键,我们可以轻松获取 map 容器中该键对应的值。

#include <iostream>
#include <map>      // map
#include <string>   // string
using namespace std;

int main() {
    //创建并初始化 map 容器
    std::map<std::string, std::string>myMap{ {"STL教程","http://c.biancheng.net/stl/"},
                                             {"C语言教程","http://c.biancheng.net/c/"},
                                             {"Java教程","http://c.biancheng.net/java/"} };
    string cValue = myMap["C语言教程"];
    cout << cValue << endl;
    return 0;
}

程序执行结果为:

http://c.biancheng.net/c/

注意,只有当 map 容器中确实存有包含该指定键的键值对,借助重载的 [ ] 运算符才能成功获取该键对应的值;反之,若当前 map 容器中没有包含该指定键的键值对,则此时使用 [ ] 运算符将不再是访问容器中的元素,而变成了向该 map 容器中增添一个键值对。其中,该键值对的键用 [ ] 运算符中指定的键,其对应的值取决于 map 容器规定键值对中值的数据类型,如果是基本数据类型,则值为 0;如果是 string 类型,其值为 "",即空字符串(即使用该类型的默认值作为键值对的值)。

#include <iostream>
#include <map>      // map
#include <string>   // string
using namespace std;

int main() {
    //创建空 map 容器
    std::map<std::string, int>myMap;
    int cValue = myMap["C语言教程"];
    for (auto i = myMap.begin(); i != myMap.end(); ++i) {
        cout << i->first << " "<< i->second << endl;
    }
    return 0;
}

程序执行结果为:

C语言教程 0

5.迭代元素

#include <iostream>
#include <map>      // pair
#include <string>       // string
using namespace std;

int main() {
    //创建并初始化 map 容器
    map<string, string>myMap{ {"STL教程","http://c.biancheng.net/stl/"},{"C语言教程","http://c.biancheng.net/c/"} };

    //调用 begin()/end() 组合,遍历 map 容器
    for (map<string, string>::iterator iter = myMap.begin(); iter != myMap.end(); ++iter) {
        cout << iter->first << " " << iter->second << endl;
    }
    return 0;
}

程序执行结果为:

C语言教程 http://c.biancheng.net/c/
STL教程 http://c.biancheng.net/stl/

6.删除元素

删除键为bfff指向的元素
 
cmap.erase("bfff");
 
 
删除迭代器 key所指向的元素
map<string,int>::iterator key = cmap.find("mykey");
if(key!=cmap.end())
{
    cmap.erase(key);
}
 
删除所有元素
cmap.erase(cmap.begin(),cmap.end());

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

map 详解(C++) 的相关文章

随机推荐

  • Meta开源多感官大模型,AI用6种模态体验虚拟世界,听引擎声就会画汽车|CVPR2023...

    梦晨 发自 凹非寺 量子位 公众号 QbitAI Meta最新6模态大模型 xff0c 让AI以更接近人类的方式理解这个世界 比如当你听见倒水声的时候就会想到杯子 xff0c 听到闹铃声会想到闹钟 xff0c 现在AI也可以 尽管画面中没有
  • 自动驾驶仿真系统登Nature子刊,准确建模事故率事故类型,全华人团队打造

    严鑫涛 投稿自 凹非寺 量子位 公众号 QbitAI 自动驾驶测试离不开仿真系统 这种高效低成本的方法 xff0c 可以模拟车辆在真实环境下遇到的各种情况 xff0c 以提高车辆真正上路后的安全性 因此 xff0c 模型的准确性成为了仿真系
  • windows10快捷键(windows10常用快捷键大全)

    时间就是金钱 xff0c 那么我们该如何提升办公效率已经变得非常的必须 xff0c 能用键盘操作的东西 xff0c 几乎不用鼠标去点击 xff0c 所以快捷键就变得非常的重要 那么今天就和大家一起来分享Windows 10的各种快捷键 Wi
  • 影响SQL Server数据库应用性能的几个常见因素 (2012/1/18)

    转自 xff1a http blogs msdn com b apgcdsd archive 2012 01 18 sql server 2012 1 18 aspx 影响SQL Server数据库应用性能的几个常见因素 性能问题是困扰数据
  • 字符移位(腾讯2017实习生)

    字符移位 1 题目 xff1a 小Q最近遇到了一个难题 xff1a 把一个字符串的大写字母放到字符串的后面 xff0c 各个字符的相对位置不变 xff0c 且不能申请额外的空间 你能帮帮小Q吗 xff1f 输入描述 输入数据有多组 xff0
  • 【群晖Nas开启WebDAV服务,路由器映射端口,实现Win10远程映射网路驱动器】

    群晖Nas开启WebDAV服务 xff0c 路由器映射端口 xff0c 实现Win10远程映射网路驱动器 群晖Nas开启WebDAV服务路由器映射端口实现Win10远程映射网路驱动器 群晖Nas开启WebDAV服务 登录群晖 xff0c 在
  • 租用游艇问题 石子合并问题 动态规划实验

    实验名称 xff1a 动态规划 一 实验预习 1 实验目的 1 理解并掌握动态规划方法的设计思想 xff1b 2 提高应用动态规划方法解决问题和设计算法的能力 xff1b 3 通过编程实现租用游艇问题和石子合并问题 xff0c 进一步理解动
  • django项目初始化

    django项目初始化 1 为了方便管理app xff0c 我们添加专门的apps文件夹来存放所有的app 结构如下 1 1设置完apps文件夹以后我们需要对配置文件做相应的更改 1 1 1 在seetings py里添加django文件的
  • 关于 Linux 输入正确账号密码显示 Sorry,that did not work的问题

    解决办法 xff1a 1 设置用户名时不要以数字开头 xff0c 字母和下划线都是可以的 xff0c 2 字母设置时记得开没开大小写 xff0c 在输入账号密码时大写Capslock是没用的 xff0c 要 shift 43 字母 xff0
  • 最小二乘与最大似然估计之间的关系

    在测量误差服从高斯分布的情况下 xff0c 最小二乘法等价于极大似然估计 Ref xff1a 最小二乘法与极大似然估计的区别与联系 最小二乘与最大似然估计之间的关系
  • Python使用pydub库对mp3与wav格式进行互转的方法

    我们需要用到一个叫pydub的类库 xff0c pydub是python的高级一个音频处理库 xff0c 可以让你以一种不那么蠢的方法处理音频 开发者原话 1 https github com jiaaro pydub 附上开发者的gith
  • 安装docker,vulhub

    1 sudo apt install apt transport https ca certificates curl gnupg agent software properties common 2 curl fsSL https dow
  • 5GC移动性管理(5GS mobility management ,5GMM)

    主要内容 介绍5GC中移动性管理功能的实现 注册管理状态模型连接管理状态模型UE Context的构成用户标识符 xff08 SUPI SUCI PEI等 xff09 移动性管理限制及术语 xff08 注册区 禁止区域 服务受限区域 xff
  • 云计算实战系列三(Linux文件管理)

    文件管理 1 Linux目录结构 1 1 WINDOWS LINUX 对比 Windows 以多根的方式组织文件 C D E Linux 以单根的方式组织文件 1 2 简介 目录结构 xff1a FSH Filesystem Hierarc
  • hashCode()和equals()的区别

    一 hashCode 和equals 是什么 xff1f hashCode 方法和equals 方法的作用其实一样 xff0c 在Java里都是用来对比两个对象是否相等一致 二 hashCode 和equals 的区别 下边从两个角度介绍了
  • debian下smplayer播放视频无声音的问题

    请先安装解码器和smplayer 解码器essential 20071007 tar bz2一般都是手动安装 xff0c smplayer使用apt get install即可 安装过程 xff0c 参考mplayer官网步骤 xff1a
  • iOS可视化界面编程XIB简单使用

    iOS的UI界面的编写现在基本分为三个流派 手写代码XIBStoryBoard 三者区别 本文主要介绍XIB的简单使用 xff0c 基于XIB在界面上放几个按钮并生成点击事件代码 以下代码及截图基于XCode12 快速创建 1 创建文本对象
  • 方面情感分析的四个情感元素介绍

    方面情感分析介绍 一般情感分析的问题由两个部分组成 xff1a 目标和情绪 目标可以是实体也可以是实体的某一个属性 xff0c 方面 xff0c 特点等等 xff0c 情绪是表达对目标的感情 xff0c 这里一般是积极 xff0c 消极 x
  • go中使用sqlite

    1 安装mingw64 1 1 下载mingw sqlite作为一个快速开发的数据库 xff0c 理应被go支持 xff0c 但是要在go里面使用sqlite xff0c 实际上是要下载sqlite的源代码编译的 xff0c 当然 xff0
  • map 详解(C++)

    现实中的数据很多是关联的 xff0c 例如书本名称和价格 xff0c 每条数据都含有两部分 xff1a 信息学竞赛一本通 xff1a 80 高等数学 xff1a 27 5 生物信息分析 xff1a 35 5 我们可以使用map存储这类一对一