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注意事项的更多相关文章

  1. java8使用stream的collect进行list转map注意事项

    1.创建Person类 package com.xkzhangsan.normal.collectors; public class Person { private Integer id; priv ...

  2. C++ map注意事项

    1.在map中,由key查找value时,首先要判断map中是否包含key. 2.如果不检查,直接返回map[key],可能会出现意想不到的行为.如果map包含key,没有问题,如果map不包含key ...

  3. c++ map 注意事项

    1.  往map里面插入元素: 下标方式[]:    map[key] = value; 调用insert:       map.insert(make_pair(key, value)); 下标方式 ...

  4. gson 转换 List<Map> 注意事项

    如果list泛型显示指定Map类型, 这时的Map 不能直接转换为 jre自带的 map类型 gson封装了 StringMap 进行转换

  5. HashMap的使用方法及注意事项

    99.Map(映射):Map 的keySet()方法会返回 key 的集合,因为 Map 的键是不能重复的,因此 keySet()方法的返回类型是 Set:而 Map 的值是可以重复的,因此 valu ...

  6. Golang 数组、切片、映射

    定义数组 var arr1 [5]int //整型类型 fmt.Println(arr1) //[0 0 0 0 0] //赋值 arr1 = [5]int{1, 2, 3, 4, 5} fmt.Pr ...

  7. 小程序-地图API

    摘要 地图组件-map 注意事项&&Bug: 1.map 组件是由客服端创建的原生组件,它的层级是最高的. 2.请勿在scroll-view中使用map组件 3.css动画对map组件 ...

  8. slice使用了解

    切片 什么是slice slice的创建使用 slice使用的一点规范 slice和数组的区别 slice的append是如何发生的 复制Slice和Map注意事项 什么是slice Go中的切片,是 ...

  9. Map,List,POJO深拷贝(序列化实现)方法与注意事项

    转载请注明出处,谢谢! 方法1: /*jdk >= 1.5*/ @SuppressWarnings("unchecked") public static <T> ...

随机推荐

  1. 【JavaScript&jQuery】返回顶部

    <!doctype html> <html> <head> <meta charset="utf-8"> <title> ...

  2. 【BZOJ4943】【NOI2017】蚯蚓排队(哈希)

    [BZOJ4943][NOI2017]蚯蚓排队(哈希) 题面 BZOJ 洛谷 UOJ 题解 记得去年看网络同步赛的时候是一脸懵逼的. 昨天看到\(zsy\)做了,今天就看了看.. 这不是\(Hash\ ...

  3. 【HDU4652】Dice(数学期望,动态规划)

    [HDU4652]Dice(数学期望,动态规划) 题面 Vjudge 有一个\(m\)面骰子 询问,连续出现\(n\)个相同的时候停止的期望 连续出现\(n\)个不同的时候停止的期望 题解 考虑两种分 ...

  4. 51NOD 1559:车和矩形——题解

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1559 波雷卡普有一个n×m,大小的棋盘,上面有k个车.他又放了q个矩形在 ...

  5. Native Wifi API

    原文链接地址:https://www.cnblogs.com/jackcin/p/3285357.html 在windows平台下,可以使用native wifi api来控制无线网卡,包括获取无线网 ...

  6. 「CodePlus 2017 11 月赛」可做题

    这种题先二进制拆位,显然改的位置只有每一段确定的数的开头和结尾,只需要对于每一个可决策位置都尝试一下填1和0,然后取min即可. #include<iostream> #include&l ...

  7. 【agc003E】Sequential operations on Sequence

    Portal -->agc003E Description 给你一个数串\(S\),一开始的时候\(S=\{1,2,3,...,n\}\),现在要对其进行\(m\)次操作,每次操作给定一个\(a ...

  8. 【CF962E】Byteland, Berland and Disputed Cities

    Portal! ---> 几句话题意 数轴上面有三种点(B点,R点,P点),现在要将其中的某些点连起来,满足将所有B点去掉之后,所有P点和R点都连通&将所有R点去掉之后,所有B点和P点都 ...

  9. 洛谷P1445 [Violet] 樱花 (数学)

    洛谷P1445 [Violet] 樱花 题目背景 我很愤怒 题目描述 求方程 1/X+1/Y=1/(N!) 的正整数解的组数,其中N≤10^6. 解的组数,应模1e9+7. 输入输出格式 输入格式: ...

  10. lsof显示打开的文件

    lsof `which httpd` //那个进程在使用apache的可执行文件 lsof /etc/passwd //那个进程在占用/etc/passwd lsof /dev/hda6 //那个进程 ...