map 可以当作特殊的数组来使用,在数组开不下,或者数组下标不是整数的时候使用 map 就很方便,比如统计字符串的出现个数,统计 int 范围内的数的出现次数等等。
映射是指两个集合之间的元素的相互对应关系。就是一个元素对应另外一个元素。
打个比方说有一个姓名的集合

{

"

T

o

m

"

,

"

J

o

n

e

"

,

"

M

a

r

y

"

}

\{"Tom", "Jone", "Mary"\}

{"Tom","Jone","Mary"},班级集合

{

1

,

2

}

\{1,2\}

{1,2}。姓名与班级之间可以有如下的映射关系:

c

l

a

s

s

(

"

T

o

m

"

)

=

1

class("Tom")=1

class("Tom")=1,

c

l

a

s

s

(

"

J

o

n

e

"

)

=

2

class("Jone")=2

class("Jone")=2,

c

l

a

s

s

(

"

M

a

r

y

"

)

=

1

class("Mary") =1

class("Mary")=1


我们称其中的姓名集合为关键字集合(key),班级集合为值集合(value)。

构造一个 mapmap<T1, T2> m ;
定义了一个名为的从T1类型到T2类型的映射。
访问 map 的某一个位置和改变 map 某一个位置的数据的操作与数组一样,直接用 [] 就能访问或更改值了。
所以咱们也可以把 map 看成是一种特殊数组,下标可以不为整数的数组。

#include <iostream>
#include <map>
#include <string>
using namespace std;
int main() {
map<string, int> dict;
//dict是一个string到int的映射,存放每个名字对应的班级号,初始时为空
dict["Tom"] = 1;
// {"Tom"->1}
dict["Jone"] = 2;
// {"Tom"->1, "Jone"->2}
dict["Mary"] = 1;
// {"Tom"->1, "Jone"->2, "Mary"->1}
cout << "Mary is in class " << dict["Mary"] << endl;
cout << "Tom is in class " << dict["Tom"] << endl;
return 0;
}

直接访问 map 中的一个位置,时间复杂度为 O ( l o g ⁡  n ) O(log⁡\ n) O(log⁡ n)。

不过我们如果用刚才的方法访问 map 会有一个很神奇的事情。(啊先卖个关子…)
如果我们在访问 dict[Tom] 的时候,map 内部还没有 "Tom" 这个下标的话,系统会自动给 "Tom" 生成一个映射,其 value 为对应类型的默认值也就是它自动会完成(这里以string类型举例)dict[Tom] = "";
这句话。
但是我们一般都不需要系统这么做,我们想知道 "Tom" 这个 key 是否在 map 里存在;这时就可以借助 count 函数进行判断。
如果这个 key 存在会返回

1

1

1 ;否则会返回

0

0

0 。

#include <iostream>
#include <map>
#include <string>
using namespace std;
int main() {
map<string, int> dict; // {}
dict["Tom"] = 1; // {"Tom"->1}
dict["Jone"] = 2; // {"Tom"->1, "Jone"->2}
dict["Mary"] = 1; // {"Tom"->1, "Jone"->2, "Mary"->1}
if (dict.count("Mary")) {
cout << "Mary is in class " << dict["Mary"] << endl;
} else {
cout << "Mary has no class" << endl;
}
return 0;
}

map 的迭代器的定义和 set 差不多:map<T1, T2>::iterator it
这样就定义了一个迭代器,其中 T1 , T2 分别是 keyvalue 的类型。

C++通过迭代器可以访问集合中的每个元素。这里迭代器指向的元素是一个 pairpair 可以看作是一个有两个成员变量 firstsecond 的结构体,排序方法默认为先比较 firstfirst小的算小,first 一样就比较 secondsecond 小的算小。在 map 里每一个 pairfirstsecond 分别代表一个映射的 keyvalue

我们用->(捡大鱼 指向的)运算符来获取值,it->first(*it).first 的效果一样,就是获取迭代器 it 指向的 pairfirst 成员的值。

#include <iostream>
#include <map>
#include <string>
using namespace std;
int main() {
map<string, int> dict;
// {}
dict["Tom"] = 1;
// {"Tom"->1}
dict["Jone"] = 2;
// {"Tom"->1, "Jone"->2}
dict["Mary"] = 1;
// {"Tom"->1, "Jone"->2, "Mary"->1}
for (map<string, int>::iterator it = dict.begin(); it != dict.end(); it++) {
cout << it->first << " -> " << it->second << endl;
// first 是关键字, second 是对应的值
}
return 0;
}

STL容器:map的更多相关文章

  1. STL容器 -- Map

    核心描述: map 就是从键(key) 到 值(value) 的一个映射.且键值不可重复,内部按照键值排序. 头文件: #include <map> 拓展: multimap 是一个多重映 ...

  2. STL容器Map

    Map的常见函数 Map的实现机制 STL中的Map底层实现机制是RB树(红-黑树)

  3. STL - 容器 - Map(二)

    把Map用作关联式数组 MapAdvanceTest.cpp #include <map> #include <string> #include <iostream> ...

  4. STL - 容器 - Map(一)

    MapTest.cpp #include <map> #include <string> #include <iostream> #include <algo ...

  5. STL中map与hash_map容器的选择收藏

    这篇文章来自我今天碰到的一个问题,一个朋友问我使用map和hash_map的效率问题,虽然我也了解一些,但是我不敢直接告诉朋友,因为我怕我说错了,通过我查询一些帖子,我这里做一个总结!内容分别来自al ...

  6. STL容器——对map排序

    STL容器(三)——对map排序 对于map的排序问题,主要分为两部分:根据key排序:根据value排序.下面我们就分别说一下~ 1. 根据key进行排序 map默认按照key进行升序排序 ,和输入 ...

  7. 【STL容器学习】-关联容器与map的用法

    STL提供了4个关联容器:set.multiset.map和multimap.这些容器提供了通过keyword高速存储和訪问数据元素的能力.Set和map不同意有反复keyword,而multiset ...

  8. C++ STL 中 map 容器

    C++ STL 中 map 容器 Map是STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值)的数据 处理能力,由于这个特性,它 ...

  9. 使用C++STL的map容器实现一种命令映射

    因为最近在练习写一个ftp的服务器,其中的命令有很多种,每个命令对应一个执行函数,能够想到的最简单的实现方式便是使用if--else匹配命令和执行对应的函数,如下所示: if(strcmp(" ...

  10. C++STL之map映照容器

    map映照容器 map映照容器的元素数据是由一个键值和一个映照数据组成的, 键值与映照数据之间具有一一映照关系. map映照容器的数据结构也是采用红黑树来实现的, 插入元素的键值不允许重复, 比较函数 ...

随机推荐

  1. 做副业的我很迷茫,但ChatGPT却治好了我——AI从业者被AI模型治愈的故事

    迷茫,无非就是不知道自己要做什么,没有目标,没有方向. 当有一个明确的目标时,往往干劲十足.但做副业过程中,最大的问题往往就是 不知道自己该干什么. 干什么?怎么干?干到什么程度?这是做副业(甚至任何 ...

  2. 深入理解Go语言接口

    1. 引言 接口是一种定义了软件组件之间交互规范的重要概念,其促进了代码的解耦.模块化和可扩展性,提供了多态性和抽象的能力,简化了依赖管理和替换,方便进行单元测试和集成测试.这些特性使得接口成为构建可 ...

  3. .NET周报 【6月第3期 2023-06-18】

    国内文章 揭秘 Task.Wait https://www.cnblogs.com/eventhorizon/p/17481757.html Task.Wait 是 Task 的一个实例方法,用于等待 ...

  4. QOJ 6504. CCPC Final 2022 D Flower's Land 2题解

    QOJ 6504. CCPC Final 2022 D Flower's Land 2题解 题意简述 给你一个只含 \(0,1,2\) 的序列,相邻两个相同的数字可以直接消掉. 询问包含两种 区间所有 ...

  5. 在HTML中引入React和JSX

    前言 Vue 可以非常方便地与 Pure HTML 结合,代替 jQuery 的功能,有一次遇到类似的场景时,我就想 React 能不能也以这种方式接入 HTML 网页,从而提高开发效率. 结果当然是 ...

  6. JSGRID loaddata显示超级多空行

    这个逼问题困扰了我两天了 作为一个主后端的程序员 初体验前端技术栈真的麻之又麻 以防万一 请先确认 是不是和我一个情况 如果是 请往下看 首先 我们需要念一段咒语 json是json string是s ...

  7. 伸展树(Splay)详解

    引入 在一条链中,二叉查找树的时间复杂度就会退化成 \(O(n)\),这时我们就需要平衡树来解决这个问题. \(Splay\)(伸展树)是平衡树的一种,它的每一步插入.查找和删除的平摊时间都是 \(O ...

  8. KVM "shutting down, reason=crashed" 问题处理

    打开debug日志抓取信息 2022-10-12 07:42:43.698+0000: 63115: debug : processMonitorEOFEvent:4814 : Monitor con ...

  9. js闭包的一些笔记

    闭包 闭包是一个可以访问外部作用域的内部函数,即使这个外部作用域已经执行结束 作用域 作用域决定这个变量的生命周期及其可见性.当我们创建一个函数,就会生成一个新的作用域. 通过var创建的变量只有函数 ...

  10. vulnhub Necromancer wp

    flag1 nmap -sU -T4 192.168.220.130 有666端口 nc -nvu 192.168.220.130 666 监听回显消息 tcpdump host 192.168.22 ...