STL容器:map

 

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;
}

作者:chinjinyu

出处:https://www.cnblogs.com/popfront/p/17621707.html

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

posted @   popcoount  阅读(13)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
more_horiz
keyboard_arrow_up light_mode palette
选择主题
点击右上角即可分享
微信分享提示