c++ map 注意事项
1. 往map里面插入元素:
下标方式[]: map[key] = value;
调用insert: map.insert(make_pair(key, value));
下标方式是通过重载[]操作符来实现的,它直接进行插入或覆盖,
而insert方法会判断是否存在相同的key,如果存在则直接返回,放弃插入操作。如果不存在才进行插入。
2. 从map里面获取元素
下标方式: if()value = map[key];
迭代器方式: value = itor->second;
需要检查key是否存在,如果不存在,map[key]返回就是未知,而不是null,因为这时会在map中插入一个key的元素,value取默认值,返回value,所以未知,是很危险的操作,建议使用迭代器的方式,会习惯性的去判断itor指针是否合法。
如下:仅供参考
if(map.count(key)>0) //count(key) 0:not in map, 1:in
{
return map[key];
} itor = map.find(key);
if(itor!=map.end())
{
return itor->second;
}
下标方法很直观,但是效率差很多。因为需要执行两次查找,因此,无论从安全性还是效率考虑,都推荐使用后一种方法。
3. map元素的删除
auto itor_next = map.erase(itor);
//c++11 中返回的是移除元素后的下一个迭代器, 这个参数必须是容器中的有效迭代器,不能是结束迭代器。如果迭代器参数指向的是容器的最后一个元素,那么会返回结束迭代器
// list的earse也是返回下一个
list遍历删除,仅供参考
for (itor = list->begin(); itor != list->end(); )
{
if(itor == delete)
{
//返回下一个元素itor,需要赋值以便后续遍历
itor =list->erase(itor); //list->erase(it); itor++ //错误,当前itor已经删除,itor++会crash
//list->erase(it++); //正确,
}
else
{
it++;
}
}
4. map的key是否可以为类class或者struct,自定义呢,需要注意哪些
答案是可以的, 如:std::map<std::string,std::string>
自定义的也是可以的,但是:必须要重载运算符 <, 由于std::string已经重载,所以可以直接用
https://blog.csdn.net/zhubaohua_bupt/article/details/62036499
//看看map的定义
template <class Key, class T, class Compare = less<Key>, class Alloc = alloc>
各个参数:第一个key,第二个value,,第三个Compare是比较函数(小于),第四个是内存配置对象
map内部存储机制实际是以红黑树为基础,红黑树在插入节点时,必须依照大小比对之后在一个合适的位置上执行插入动作。
所以作为关键字,起码必须有“<”这个比较操作符。
基础类型 int,float等等都有内置的比较函数,与map搭配无论是插入还是查找,都没什么问题。
但是作为class或者struct,如果没有明确定义“<”比较操作符,就不能与map直接搭配使用,除非我们自己提供第三个参数compare函数
因此:
map的key需要满足以下两点:
1. “<”比较操作符, 自定义的类,需要重载运算符 <
2. 如果没有“<”比较操作符,需要自定义第三个参数Compare,该仿函数实现“()”操作符,提供比较功能。插入时各节点顺序通过该仿函数来比较
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 ...
- gson 转换 List<Map> 注意事项
如果list泛型显示指定Map类型, 这时的Map 不能直接转换为 jre自带的 map类型 gson封装了 StringMap 进行转换
- C++——map注意事项
1. C++标准模块库STL中提供了两种基本的关联容器:set和map.其内部实现是都是采用红黑树,但不同的是,set中结点存储的是键值,map中结点存储的是<key,value>的键值对 ...
- 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> ...
随机推荐
- 泊爷带你学go -- 反射的经典玩法
package main import ( "fmt" "reflect" ) type order struct { ordId int customerId ...
- 集群web-ui
一旦Hadoop集群启动并运行,可以通过web-ui进行集群查看,如下所述: 1.hdfs的集群端口号默认50070 NameNode http://localhost1:50070(默认端口号po ...
- Mac OS本地,XAMPP,出现 “phpMyAdmin 尝试连接到 MySQL 服务器,但服务器拒绝连接”错误
phpMyAdmin 尝试连接到 MySQL 服务器,但服务器拒绝连接.您应该检查配置文件中的主机.用户名和密码,并确认这些信息与 MySQL 服务器管理员所给出的信息一致. 原因一:有可能是因为修改 ...
- 牛客网PAT乙级(Basic Level)真题-组个最小数 (20)
组个最小数 (20) 时间限制 1000 ms 内存限制 32768 KB 代码长度限制 100 KB 判断程序 Standard (来自 小小) 题目描述 给定数字0-9各若干个.你可以以任意顺序排 ...
- 用PHP判断是否闰年(正则匹配法)
<?php /** * PHP判断是否闰年 */ $year="2004-02-29"; $pattern='/(([0-9]{3}[1-9]|[0-9]{2}[1-9][0 ...
- Golang的流程控制
流程控制 条件语句 例: var b bool = true if b{ fmt.Print("b是True") }else{ fmt.Print("b是false&qu ...
- MySQL基本操作——1
1.命令行启动或关闭MySQL服务:方式一:计算机--右击管理--服务方式二:net start MySQL服务器名称net stop MySQL服务器名称 2.登录和退出(必须在MySQL服务启动的 ...
- Web 建站技术中,HTML、HTML5、XHTML、CSS、SQL、JavaScript、PHP、ASP.NET、Web Services 是什么(转)
Web 建站技术中,HTML.HTML5.XHTML.CSS.SQL.JavaScript.PHP.ASP.NET.Web Services 是什么?修改 建站有很多技术,如 HTML.HTML5.X ...
- webbug3.0靶场第二关
由于是新手,当看见一个图片后一脸蒙比,查了一下才知道这原来叫做隐写术 看人家说破解图片隐写术用Stegsolve非常好用,然后查了一下kali软件仓库并没有找到Steegsolve这个软件,只能另想他 ...
- Sql Server 2005/2008数据库被标记为“可疑”/“质疑”的问题
日常对Sql Server 2005关系数据库进行操作时,有时对数据库(如:Sharepoint网站配置数据库名Sharepoint_Config)进行些不正常操作如数据库在读写时而无故停止数据库,从 ...