前言

映射是指两个集合之间的元素的相互对应关系。通俗地说,就是一个元素对应另外一个元素。

比如有一个姓名的集合{"Tom “Jone”, “Mary”},班级集合{1,2}。姓名与班级之间可以有如下的映射关系:
class(“Tom”) = 1,class(“Jone”) = 2, class(“Mary”) = 1

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

在C++中我们常用的映射是 map

引用库

在 C++ 中 map的实现在一个 <map>头文件中,在代码开头引入这个头文件,并且加入一句 using namespace std

#include <map>
using namespace std;

构造一个映射

现在我们来构造一个映射。

在 C++ 中,我们构造一个 map 的语句为:map<T1, T2>m;。 这样我们定义了一个名为 m 的从 T1 类型到 T2 类型的映射。初始的时候 m 是空映射。

插入映射

在 C++ 中通过 insert() 方法向集合中插入一个新的映射,参数是一个 pair 类型的结构。这里需要用到另外一个 STL 模板——元组( pair ),pair<int,char>(1,'a')定义了一个整数 1 和字符 a 的 pair。我们向映射中加入新映射对的时候就是通过加入 pair 来实现的。如果插入的 key 之前已经有了 value,不会用插入的新的 value 替代原来的 value,也就是此次插入是无效的。

#include <map>
#include <string>
using namespace std;
int main() {
    map<string, int> dict;  // {}
    dict.insert(pair<string, int>("Tom", 1)); // {"Tom"->1}
    dict.insert(pair<string, int>("Jone", 2)); // {"Tom"->1, "Jone"->2}
    dict.insert(pair<string, int>("Mary", 1)); // {"Tom"->1, "Jone"->2, "Mary"->1}
    dict.insert(pair<string, int>("Tom", 2)); // {"Tom"->1, "Jone"->2, "Mary"->1}
    return 0;
}

访问映射

在 C++ 中访问映射和数组一样,直接用 [ ]就能访问。比如 dict["Tom"]就可以获取"Tom"的班级了。而这里有一个比较神奇的地方,如果没有对"Tom"做过映射的话,此时你访问 dict["Tom"],系统将会自动为"Tom"生成一个映射,其value为对应类型的默认值。并且我们可以之后再给映射赋予新的值,比如 dict["Tom"]=3,这样为我们提供了另一种方便的插入手段。当然有些时候,我们不希望系统自动为我们生成映射,这时候我们需要检测"Tom"是否已经有映射了,如果已经有映射再继续访问。这时就需要用 count()函数进行判断,在下一页中我们会详细介绍。

#include <map>
#include <string>
#include <stdio.h>
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}
    printf("Mary is in class %d\n", dict["Mary"]);
    printf("Tom is in class %d\n", dict["Tom"]);
    return 0;
}

查找关键字

在 C++ 中,如果你想知道某个关键字是否被映射过,你可以直接用 count()方法。如果被映射过,返回 1,否则会返回 0

#include <map>
#include <string>
#include <stdio.h>
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")) {
        printf("Mary is in class %d\n", dict["Mary"]);
    } else {
        printf("Mary has no class");
    }
    return 0;
}

遍历映射

在 C++ 中,通过迭代器可以访问映射中的每对映射,每个迭代器的 first 值对应 key,second 值对应 value

#include <map>
#include <string>
#include <iostream>
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 << " is in class " << it->second << endl;
    }
    return 0;
}

清空

C++ 中调用 clear()方法可清空 map

总结

C++ 中 map 常用方法总结:

方法 功能
insert 插入一对映射
count 查找关键字
erase 删除关键字
size 获取映射对个数
clear 清空

C++ map 官方文档

对应练习题

蒜头君面试
水果店

返回目录,查看更多

收藏