C++——map注意事项
1. C++标准模块库STL中提供了两种基本的关联容器:set和map。其内部实现是都是采用红黑树,但不同的是,set中结点存储的是键值,map中结点存储的是<key,value>的键值对。在map中,由key查找value时,首先要判断map中是否包含key。如果不检查,直接返回map[key],可能会出现意想不到的行为。
2. 如果map包含key,则map[key]返回key所对应value的引用;如果map不包含key,使用下标有一个危险的副作用,会在map中插入一个key的元素,value取默认值,并返回value的引用,这就是为什么当向map中插入一个元素时,map[key] = value是成立的。综上所述,map[key]总有返回值。
3. map提供了两种方式,查看是否包含key,即使用成员函数count和find,对于map<Type1,Type2> m:
- m.count(key):由于map不包含重复的key,因此m.count(key)取值为0,或者1,表示是否包含。
- m.find(key):返回迭代器,判断是否存在。若存在则返回key对应结点的迭代器,否则返回m.end()
4. 对于查找map中是否存在key,有下面两种写法:
使用成员函数count:
bool is_map_key_exist1(const map<int,int> &m, const int &key)
{
if(m.count(key) > )
return true;
return false;
}
使用成员函数find:
bool is_map_key_exist2(const map<int,int> &m, const int &key)
{
if(m.find(key) != m.end())
return true;
return false;
}
5. 当需要进行赋值或查找key对应的值时,推荐使用find。
例如:
//map<int,int> m;
//int key;
auto it = m.find(key);
if( it != m.end())
return it->second;
可以看到只进行了一次查找。
若先使用count判断是否存在,再使用[]返回value,即:
//map<int,int> m;
//int key;
if(m.count(key) > )
return m[key];
可以看到count和[]分别进行了一次查找,即两次查找。
基于效率的考虑,我们推荐使用find。
6. 对于STL中的容器,除了使用成员函数find返回迭代器外,还有泛型算法find(begin,end,target)查找目标。
参考资料:
- https://www.cnblogs.com/nzbbody/p/3409298.html
C++——map注意事项的更多相关文章
- java8使用stream的collect进行list转map注意事项
1.创建Person类 package com.xkzhangsan.normal.collectors; public class Person { private Integer id; priv ...
- C++ map注意事项
1.在map中,由key查找value时,首先要判断map中是否包含key. 2.如果不检查,直接返回map[key],可能会出现意想不到的行为.如果map包含key,没有问题,如果map不包含key ...
- c++ map 注意事项
1. 往map里面插入元素: 下标方式[]: map[key] = value; 调用insert: map.insert(make_pair(key, value)); 下标方式 ...
- gson 转换 List<Map> 注意事项
如果list泛型显示指定Map类型, 这时的Map 不能直接转换为 jre自带的 map类型 gson封装了 StringMap 进行转换
- HashMap的使用方法及注意事项
99.Map(映射):Map 的keySet()方法会返回 key 的集合,因为 Map 的键是不能重复的,因此 keySet()方法的返回类型是 Set:而 Map 的值是可以重复的,因此 valu ...
- Golang 数组、切片、映射
定义数组 var arr1 [5]int //整型类型 fmt.Println(arr1) //[0 0 0 0 0] //赋值 arr1 = [5]int{1, 2, 3, 4, 5} fmt.Pr ...
- 小程序-地图API
摘要 地图组件-map 注意事项&&Bug: 1.map 组件是由客服端创建的原生组件,它的层级是最高的. 2.请勿在scroll-view中使用map组件 3.css动画对map组件 ...
- slice使用了解
切片 什么是slice slice的创建使用 slice使用的一点规范 slice和数组的区别 slice的append是如何发生的 复制Slice和Map注意事项 什么是slice Go中的切片,是 ...
- Map,List,POJO深拷贝(序列化实现)方法与注意事项
转载请注明出处,谢谢! 方法1: /*jdk >= 1.5*/ @SuppressWarnings("unchecked") public static <T> ...
随机推荐
- l洛谷 (水题)P4144 大河的序列
题目戳 Solution: 这题前面都是废话,关键的一句就是本题求的是序列中连续一段的相与值(&)+相或值(|)最大,然后对这个值进行快速幂取模.考虑到两个数相与最大能得到的就是这两个数中的最 ...
- [BZOJ4870][Shoi2017]组合数问题 dp+矩阵乘
4870: [Shoi2017]组合数问题 Time Limit: 10 Sec Memory Limit: 512 MB Description Input 第一行有四个整数 n, p, k, r ...
- 纪念一个日子QAQ
嗯事情是这样的 今天早上考试的时候不知道为什么特别累,精神并不是很好,T1半平面交裸题 T2当时没有仔细看题,T3想了一段时间后会正解(9:30),但是好像很难写的样子啊.. 但是似乎由于模拟考并不 ...
- 洛谷P4630 [APIO2018] Duathlon 铁人两项 【圆方树】
题目链接 洛谷P4630 题解 看了一下部分分,觉得树的部分很可做,就相当于求一个点对路径长之和的东西,考虑一下能不能转化到一般图来? 一般图要转为树,就使用圆方树呗 思考一下发现,两点之间经过的点双 ...
- 我的emacs简易配置
;;------------语言环境字符集设置(utf-8)------------- (set-language-environment 'Chinese-GB) (set-keyboard-cod ...
- rename table table1 to table2;
1. MYSQL rename table table1 to table2;
- 设置texture
//获取内部资源贴图 public void setInsideTexture() { Texture2D texture = Resources.Load(texture_url) as Textu ...
- 新生代Eden与两个Survivor区的解释
文章出处:http://ifeve.com/jvm-yong-generation/ 聊聊JVM的年轻代 1.为什么会有年轻代 我们先来屡屡,为什么需要把堆分代?不分代不能完成他所做的事情么?其实不分 ...
- python---Scrapy模块的使用(二)
出处:http://www.cnblogs.com/wupeiqi/ 一:去除重复URL scrapy默认使用 scrapy.dupefilter.RFPDupeFilter 进行去重,相关配置有: ...
- 千里之行始于足下,node.js 资源中文导航
响应@jiyinyiyong 号召,cnodjs 好的资源蛮多的,的确欠缺分类,在一群FAQ中,的确很容易沉下去,根据自己对node.js的理解,做成一个资源导航,PS:如果觉得合适,希望能够合并的c ...