C++ STL map获取键对应的值

一、方法

1、通过[]获取

类似于访问数组元素的方式。

std::map<int, string> mapInfo{ {1,"test"},{2,"lin"},{3,"wei"} };
string strData = mapInfo[1];  
std::cout << "strData: " << strData << std::endl;

结果如下:
image.png
注意:
1)只有当 map 容器中确实存有包含该指定键的键值对,借助重载的 [ ] 运算符才能成功获取该键对应的值
2)若当前 map 容器中没有包含该指定键的键值对,则此时使用 [ ] 运算符将不再是访问容器中的元素,而变成了向该 map 容器中增添一个键值对

std::map<int, string> mapInfo{ {1,"test"},{2,"lin"},{3,"wei"} };
mapInfo[5] = "li";
std::map<int, string>::iterator mapIter = mapInfo.begin();
for (; mapIter != mapInfo.end(); mapIter++)
{
    std::cout << "key: " << mapIter->first << " value: " << mapIter->second << std::endl;
}

结果如下:
image.png

3)其中,该键值对的键用 [ ] 运算符中指定的键,其对应的值取决于 map 容器规定键值对中值的数据类型,如果是基本数据类型,则值为 0;如果是 string 类型,其值为 "",即空字符串(即使用该类型的默认值作为键值对的值)
4)[]具有添加新的键值对的前提是:当前map容器中不存在新添加的键
5)如map容器中已存在对应键,执行map[key] = value是修改键key的值,而不是为 map 容器添加新键值对

mapInfo[5] = "wne";
mapIter = mapInfo.begin();
for (; mapIter != mapInfo.end(); mapIter++)
{
    std::cout << "mod key: " << mapIter->first << " value: " << mapIter->second << std::endl;
}

结果如下:
image.png

2、at()

需要指定key,才能从容器中找到该键对应的值;如果在当前容器中查找失败,该方法不会向容器中添加新的键值对,而是直接抛出 out_of_range 异常。

std::map<int, string> mapInfo{ {1,"test"},{2,"lin"},{3,"wei"} };
mapInfo[5] = "li";

try
{
    std::cout << mapInfo.at(3) << std::endl;
    std::cout << mapInfo.at(10) << std::endl;
       
}
catch (const std::exception&)
{
    std::cout << "调用at获取键对应的值异常" << std::endl;
}

结果如下:
image.png

3、find

如果查找成功,该迭代器指向查找到的键值对;反之,则指向 map 容器最后一个键值对之后的位置(和 end() 成功方法返回的迭代器一样)。

std::map<int, string> mapInfo{ {1,"test"},{2,"lin"},{3,"wei"} };
mapInfo[5] = "li";

std::map<int, string>::iterator mapIter = mapInfo.find(5);
if (mapIter != mapInfo.end())
{
    std::cout << mapIter->first << "  " << mapIter->second << std::endl;
}

结果如下:
image.png

4、若以上方法都不能获取到值,那只能遍历整个map容器查找,进而获取值
具体代码在这里就不写了

小菜鸟一枚,望各位大佬不吝指教,用于记录学习

1 声望
0 粉丝
0 条评论
推荐阅读
C++ STL multiset容器
multiset 类模板提供的构造函数,和 set 类模板中提供创建 set 容器的构造函数,是完全相同的。因此创建set容器的方式适用于创建multiset容器。具体的方法参考set容器:[链接]

等待樱花盛开阅读 970

年度最佳【golang】sync.Map详解
工作中,经常会碰到并发读写 map 而造成 panic 的情况,为什么在并发读写的时候,会 panic 呢?因为在并发读写的情况下,map 里的数据会被写乱,之后就是 Garbage in, garbage out,还不如直接 panic 了。

去去10024阅读 7.2k

万字避坑指南!C++的缺陷与思考(上)
导语 | 本文主要总结了本人在C++开发过程中对一些奇怪、复杂的语法的理解和思考,同时作为C++开发的避坑指南。前言C++是一门古老的语言,但仍然在不间断更新中,不断引用新特性。但与此同时C++又甩不掉巨大的历史...

腾讯云开发者6阅读 517

麒麟操作系统 (kylinos) 从入门到精通 - 研发环境 - 第二十一篇 C++/C语言开发环境搭建
类别:笔记本型号:中国长城 NF14C硬件平台:飞腾处理器(ArmV8 指令集)系统:银河麒麟操作系统 V10 SP1(2203) 关键词:信创,麒麟系统,linux,c++,c,内核飞腾,arm

码上世界1阅读 2.3k评论 1

封面图
万字避坑指南!C++的缺陷与思考(下)
导读 | 在万字避坑指南!C++的缺陷与思考(上)一文中,微信后台开发工程师胡博豪,分享了C++的发展历史、右值引用与移动语义、类型说明符等内容,深受广大开发者喜爱!此篇,我们邀请作者继续总结其在C++开发过...

腾讯云开发者5阅读 484评论 1

一种将函数模板定义和声明分开的方法
&emsp;&emsp;在 C++ 中为了操作简洁引入了函数模板。所谓的函数模板实际上是建立一个通用函数,其函数类型或形参类型不具体指定,用一个虚拟的类型来表达,这个通用函数就称为函数模板。

Sharemaker阅读 864

封面图
Workflow的JSON解析器
Workflow中有一个小而美的json-parser,一千行代码写得非常典雅精致。不仅可以学习到经典的C语言写法、递归解析的架构、与内核近似的编码风格、简洁的接口设计,而且也非常方便引入项目中作为轻量级的json解析器...

1412阅读 812

小菜鸟一枚,望各位大佬不吝指教,用于记录学习

1 声望
0 粉丝
宣传栏