讲map之前,其实很多都在set那篇讲过了。我不熟悉的set

很多的API都类似,不会再累述。

map和set都是用红黑树实现的,但是set只能存单个值,它的key和value都是同一个,map不一样,它的每一个key都映射一个value.

接下来先介绍一些map自己的东西,再把和set一样的提一下。

四种插入新键值对的方式

现在我们定义一个空的map:

map<int,string> m;

下面展示四种方式。

一、pair方式

m.insert(pair<int,string>(10,"Tom"));

这是通过创建一个pair的匿名对象来保存数据。

二、make_pair

m.insert(make_pair(0,"Jerry"));

我们知道,make_pair就返回一个对组,这个对组就能直接赋值给map。

三、value_type方式

m.insert(map<int,string>::value_type(1,"Super"));

通过map内置的一个value_type来赋值。

四、直接插入

m[9] = "John";

这个方法看起来是最简单的,却暗藏杀机。当我们写以下语句:

m[100];

我们没有给它一个value,本意可能不想插入,但是一旦我们这么写,它就会给我们默认插进去,value为默认值。所以这个方法很可能使用不当。所以建议采用第二种创建方式,比较短,而且不容易出错。

如果访问key和value

map保存了两个值,提供了first和second两个函数来访问key和value,互相对应。

如下:

int main()
{
map<int, string> m;
m.insert(make_pair(0, "Jerry"));
m.insert(map<int, string>::value_type(1, "Super"));
m[9] = "John";
m[100];
for (auto mapIt = m.begin(); mapIt != m.end(); ++mapIt)
cout << "key:" << mapIt->first << " value:" << mapIt->second << endl;
return 0;
}

输出:

可以看到:

  • 同样也以key排好序了。
  • 且m[100]也插入了一个空。
  • 我们通过迭代器调用了second和first来访问key和value。

同样的,插入也返回一个pair<iterator,bool>类型。

指定规则排序

与set无异,在创建的同时就指定排序规则。将上述代码中,声明m的语句改为:

// MyCmp是仿函数。
map<int,string,MyCmp> m;

其它操作

查找操作

与set无异。

find(key);     //查找键key是否存在,若存在,返回该键的元素的迭代器;/若不存在,返回map.end();
count(keyElem);//返回容器中key为keyElem的对组个数。对map来说,要么是0,要么是1。对multimap来说,值可能大于1。
lower_bound(keyElem);//返回第一个key>=keyElem元素的迭代器。
upper_bound(keyElem);//返回第一个key>keyElem元素的迭代器。
equal_range(keyElem);//返回容器中key与keyElem相等的上下限的两个迭代器。

大小操作

size();//返回容器中元素的数目
empty();//判断容器是否为空

与set无异。

删除操作

clear();    //删除所有元素
erase(pos); //删除pos迭代器所指的元素,返回下一个元素的迭代器。
erase(beg,end);//删除区间[beg,end)的所有元素 ,返回下一个元素的迭代器。
erase(keyElem);//删除容器中key为keyElem的对组。

与set无异。

我不熟悉的map的更多相关文章

  1. ["1", "2", "3"].map(parseInt)?

    ["1", "2", "3"].map(parseInt)得到什么? 答案是:[1, NaN, NaN]. 原因:parseInt接收的是两 ...

  2. Java数据结构之Map学习总结

    前言: 前面学习总结了List的使用及效率对比,今天总结学习一下键值映射关系Map,顺便学习一下Android中使用Map需要注意哪些,以及谷歌官方针对Android对Map做了哪些优化. 先了解下M ...

  3. 【跟着子迟品 underscore】Array Functions 相关源码拾遗 & 小结

    Why underscore 最近开始看 underscore.js 源码,并将 underscore.js 源码解读 放在了我的 2016 计划中. 阅读一些著名框架类库的源码,就好像和一个个大师对 ...

  4. 泛函编程(37)-泛函Stream IO:通用的IO处理过程-Free Process

    在上两篇讨论中我们介绍了IO Process:Process[I,O],它的工作原理.函数组合等.很容易想象,一个完整的IO程序是由 数据源+处理过程+数据终点: Source->Process ...

  5. ACM 盗梦空间

    盗梦空间 时间限制:3000 ms  |  内存限制:65535 KB 难度:2   描述 <盗梦空间>是一部精彩的影片,在这部电影里,Cobb等人可以进入梦境之中,梦境里的时间会比现实中 ...

  6. Java数据结构之Set学习总结

    前言: 前面介绍了Java的数据结构List.Map,今天抽空学习总结一下另一种数据结构Set. Set介绍 Set相对于List.Map是最简单的一种集合.集合中的对象不按特定的方式排序,并且没有重 ...

  7. ArcGIS API for JavaScript 4.2学习笔记[6] goTo()地图动画

    这是个很有意思的例子,不过例子给的比较复杂,需要查很多API,我会在文章最后给出关键的类和属性解释. 同样发现一个很有意思的事儿:博客园似乎有爬虫,我4号发布的blogs,5号就在百度和google搜 ...

  8. 【JDK1.8】JDK1.8集合源码阅读——Set汇总

    一.前言 这一篇里,我将对HashSet.LinkedHashSet.TreeSet进行汇总分析,并不打算一一进行详细介绍,因为JDK对Set的实现进行了取巧.我们都知道Set不允许出现相同的对象,而 ...

  9. 万类之父——Object

    jdk1.8.0_144 Object类作为Java中的顶级类,位于java.lang包中.所有的类直接或者间接都继承自它.所以Object类中的方法在所有类中都可以直接调用.在深入介绍它的API时, ...

随机推荐

  1. [BZOJ4180] 字符串计数

    膜一发KsCla巨佬 #include <bits/stdc++.h> using namespace std; typedef long long ll; const int N=2e5 ...

  2. MySQL创表--分页--自关联--

    创建表book create table t_book( id int unsigned auto_increment primary key, bookName varchar(255) defau ...

  3. 福建工程学院第十四届ACM校赛M题题解 fwt进阶,手推三进制fwt

    第九集,结束亦是开始 题意: 大致意思就是给你n个3进制的数字,让你计算有多少对数字的哈夫曼距离等于i(0<=i<=2^m) 思路: 这个是一个防ak题,做法是要手推公式的fwt 大概就这 ...

  4. EBS描述性弹性域及键弹性域总结

    一.描述性弹性域 前言介绍: 描述性弹性域的实质就是系统预留自定字段,系统可以使用说明性弹性域来获取业务所特有的重要附加信息.系统可能自定义说明性弹性域,以显示存储更多信息的字段,提供一套完整的“自定 ...

  5. O008、LVM类型的Storage Pool

    参考https://www.cnblogs.com/CloudMan6/p/5277927.html   LVM类型的Storage Pool   不仅一个文件可以分配给客户机作为虚拟磁盘,宿主机上  ...

  6. JavaScript斑马线表格制作

    //实现斑马线表格 //方法1: document.write('<table border="1">'); for(var i=1; i<11; i++){ i ...

  7. python之开发规范

    命名规范 Python之父推荐的规范 Type Public Internal Modules lower_with_under _lower_with_under Packages lower_wi ...

  8. weex 通用样式以及需要注意的问题

    一.说明 weex 对于 css 样式的支持是非常有限的,并且使用样式的时候,必须遵循 weex 定义的规则. 对于不遵循 weex 样式规则的代码,往往在 web 页面上有效,而在 native 环 ...

  9. NLP 基于kashgari和BERT实现中文命名实体识别(NER)

    准备工作,先准备 python 环境,下载 BERT 语言模型 Python 3.6 环境 需要安装kashgari Backend pypi version desc TensorFlow 2.x ...

  10. Mac 常用软件

    command+space开启新的一天 窗口管理:Magnet 写代码:Pycharm.vscode.sublime text 虚拟机:VMware Fusion(买不起Parallels Deskt ...