讲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. ABC143F Distinct Numbers

    这道题非常好.其思想类似于 $O(n \log n)$ 求最长上升子序列的算法. hint:考虑固定操作次数 $o$,$k$ 最大可取到多少? int n; scan(n); vi a(n); sca ...

  2. 卸载mysql后再安装提示The service already exists!问题解决方法

    卸载mysql后再安装输入mysqld --install 回车后提示The service already exists! 原因:卸载的时候没有卸载干净 方法: 一.重新以管理员身份打开cmd 二. ...

  3. SKCTF管理系统

    一开始是一个简洁风的登录界面 康康注册界面 嗯...也是很简洁风呢. 那让我们来查看元素(fn+f12) 没有什么有flag的迹象呢! 那我们试一下注册一个账号 这时候我们已经有解题的线索了: 获得管 ...

  4. 十大经典排序算法(Python,Java实现)

    参照:https://www.cnblogs.com/wuxinyan/p/8615127.html https://www.cnblogs.com/onepixel/articles/7674659 ...

  5. C# 如何正确删除控件已添加的事件

    方法一:在相对应里窗体下面有个 "窗体.Designer.cs"文件,双击打开,找到相关事件,删除就行. 方法二:找到构造函数,“InitializeComponent()”对着它 ...

  6. Centos7:zookeeper安装,配置与使用

    配置jdk环境 解压缩zookeeper的压缩包 配置 创建data目录 复制zoo_sample.cfg为zoo.cfg 修改confg/zoo.cfg中dataDir=**/data 常用命令 . ...

  7. render:h => h(App) ----render函数

    转载其他博客1 new Vue({ 2 3 router, 4 store, 5 //components: { App } vue1.0的写法 6 render: h => h(App) vu ...

  8. Windows Electron初探

    最近闲来无事,玩玩electron. 1.安装nodejs 下载地址:http://nodejs.cn/download/,下载64位.安装完成后,打开C:\Program Files\nodejs\ ...

  9. laravel 使用 intervention/image 的注意方法

    出错NotSupportedException in AbstractEncoder.php line 151: Encodingformat (tmp) is not supported. 这个只是 ...

  10. 浅析Java泛型

    什么是泛型? 泛型是JDK 1.5的一项新特性,它的本质是参数化类型(Parameterized Type)的应用,也就是说所操作的数据类型被指定为一个参数,在用到的时候在指定具体的类型.这种参数类型 ...