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

  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. gson 转换 List<Map> 注意事项

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

  4. C++——map注意事项

    1. C++标准模块库STL中提供了两种基本的关联容器:set和map.其内部实现是都是采用红黑树,但不同的是,set中结点存储的是键值,map中结点存储的是<key,value>的键值对 ...

  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. JAVA EE------XML

    1.XML定义:在电子计算机中,标记指计算机所能理解的信息符号,通过此种标记,计算机之间可以处理包含各种的信息比如文章等.它可以用来标记数据.定义数据类型,是一种允许用户对自己的标记语言进行定义的源语 ...

  2. 在Linux系统使用VMware安装虚拟机

    首先到VMware官网上www.vmware.com下载相应的版本 我这边用的是 VMware-Workstation-Full-12.5.0-4352439.x86_64.bundle 上传到Lin ...

  3. Java的URL类(二)

    转:https://www.cnblogs.com/brokencolor/p/8575440.html Java的URL类(二) 实例: Java 通过HttpURLConnection Post方 ...

  4. java 二分法学习

    假设有一个数组 { 12, 23, 34, 45, 56, 67, 77, 89, 90 },现要求采用二分法找出指定的数值并将其在数组的索引返回,如果没有找到则返回 -1.代码如下: package ...

  5. ionic 3.0中使用原生插件ionic-native

    作为一个ionic的新手,今天使用了ionic的原生粘贴板插件  @ionic-native/clipboard,根据ionic官方文档上执行的命令 $ ionic cordova plugin ad ...

  6. 城市扩张实验---ARCGIS处理踩雷

    1. 将每个坐标点按照所属泰森多边形分类后,得到了数据统计表,导出到excel里面数据透析. 数据透析行代表泰森多边形编号,列代表地物类别,求和项是frequency.一开始的求和不会显示求和,,而是 ...

  7. C# Winform 国际化

    1.在Form的language属性选择中文,来制作中文界面 保存后,设置界面标题会变成如下所示,并且会出现一个zh-CN的资源文件,打开resx文件可看到相应内容 2.将Form的language属 ...

  8. Dapper使用技巧分享

    Dapper是轻量级的.net ORM框架,配合linq和泛型,让C#操作数据的代码简洁.高效又灵活!最近的工作项目中使用了Dapper,在这里分享一些实用技巧.阅读之前需要了解一些基本的使用方法,参 ...

  9. 使用nginx反向代理实现多端口映射(未解决)

    问题: 想实现访问在同一个主机上实现多个域名访问, 如用 blog.xxx.com访问博客(使用8000端口), app.xxx.com访问其他应用(使用8080端口): 不同的服务用URL区分,不用 ...

  10. Visual C++ 6.0中if语句的常见问题

    # include <stdio.h> int main (void) { > )//如果在第四行加分号的话,编译的时候就会在第六行出错 printf("你好\n" ...