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

信息学竞赛一本通 :¥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());

map 详解(C++)相关推荐

  1. php小程序地图处理,微信小程序 地图map详解及简单实例

    微信小程序 地图map 微信小程序map 地图属性名类型默认值说明longitudeNumber中心经度 latitudeNumber中心纬度 scaleNumber1缩放级别 markersArra ...

  2. java map详解

    java map详解 Map 是一种键-值对(key-value)集合,Map 集合中的每一个元素都包含一个键对象和一个值对象.其中,键对象不允许重复,而值对象可以重复,并且值对象还可以是 Map 类 ...

  3. sync.Map详解

    导航 Golang sync.Map 详解 简单的介绍一下 Golang Map Map 使用 sync.Map sync.Map 是什么 sync.Map 使用 sync.Map 剖析 sync.m ...

  4. .map文件 源映射(Source Map)详解

    一.什么是源映射 为了提高性能,很多站点都会先压缩 JavaScript 代码然后上线, 但如果代码运行时出现错误,浏览器只会显示在已压缩的代码中的位置,很难确定真正的源码错误位置. 这时源映射就登场 ...

  5. java中list和map详解

    java中list和map详解 一.概叙 List , Set, Map都是接口,前两个继承至Collection接口,Map为独立接口, List下有ArrayList,Vector,LinkedL ...

  6. java中set和ge什么么意思,java的Collection和Map详解

    java的Collection和Map详解 线性表,链表,哈希表是常用的数据结构,在进行Java开发时,JDK已经为我们提供了一系列相应的类来实现基本的数据结构.这些类均在java.util包中.本文 ...

  7. 目标检测指标mAP详解

    前言 相信刚刚接触目标检测的小伙伴也是有点疑惑吧,目标检测的知识点和模型属实有点多,想要工作找CV的话,目标检测是必须掌握的方向了.我记得在找实习的时候,面试官就问到了我目标检测的指标是什么,答:mA ...

  8. jquery源码解析:each,makeArray,merge,grep,map详解

    jQuery的工具方法,其实就是静态方法,源码里面就是通过extend方法,把这些工具方法添加给jQuery构造函数的. jQuery.extend({ ...... each: function( ...

  9. [转] java的 Collection 和 Map 详解

    原文转自: http://www.diybl.com/course/3_program/java/javajs/2007917/71621.html 前言        线性表,链表,哈希表是常用的数 ...

  10. python lambda ,map详解

    lambda 匿名函数 1 # 普通定义函数 2 def func1(x,y): 3 return x+y 4 # 执行函数 5 print(func(1,2)) 6 # 如果此函数只调用一次,或者功 ...

最新文章

  1. JavaScript简单重写构造器的原型
  2. linux使网卡点亮_Linux下 无线网卡配置无线唤醒功能的方法
  3. python有趣小程序-Python全栈开发-有趣的小程序
  4. Swagger Annotation 详解(建议收藏)
  5. 关闭windows端口的批处理命令
  6. 怎么将pdf转Word中英文转换器在线转换
  7. 求职面试技巧_开始求职的7个技巧
  8. Namecheap 给域名添加ssl证书
  9. 典型IO模型----阻塞IO,非阻塞IO,信号驱动IO,异步IO
  10. 人工智能的发展方向与机遇
  11. 汉语言文学与茶2019EI会议论文的融合探析
  12. 扫地机器人漫谈(三):扫地机的传感器
  13. 原来游戏技术行业最大的秘密竟然是...
  14. 整数与浮点数比较-汇编码分析
  15. Python和numpy下载安装方法
  16. java ema算法_全网最硬核 JVM TLAB 分析 3. JVM EMA期望算法与TLAB相关JVM启动参数
  17. 主机托管的优势,为什么要选择主机托管
  18. HTML生日快乐代码 (粉色主题)(HTML5+CSS3+JS)520表白代码/七夕情人节网页/告白/求婚/生日快乐...
  19. H3C路由器配置命令.doc
  20. Godot Engine:用Shader实现旗帜飘飘的效果

热门文章

  1. 《Cisco安全防火墙服务模块(FWSM)解决方案》——2.6 硬件架构
  2. JAVA接口和抽象类的特点
  3. LAMP环境安装1之freetype
  4. 少量数据通过Excel表格数据导入server SqlServer查询
  5. 进程之基础知识(一)
  6. Android学习---解决Android Graphical Layout 界面效果不显示
  7. H3C交换机配件RS232配置线(DB9针转RJ45)
  8. MyBatis配置项--配置环境(environments)
  9. 华为云的Kubernetes实践之路
  10. javaScript之函数,分支结构 ,循环结构(二)