5. map 映射

映射(map) 是 STL 中一种存储键值对(Key-Value)信息的容器。其中键(Key)不能重复,通常用于使用键来快速查找值的场景。

映射 内部用红黑树实现,其查找、插入、删除的时间复杂度都是 O(logⁿ)。

map 模板的定义方法如下:

template<
    class Key,
    class T,
    class Compare = std::less<Key>,
    class Allocator = std::allocator<std::pair<const Key, T>>
> class map;

说明:

映射 存储的信息是 std::pair<const Key, T> 类型的数据。 每个数据都有两个成员变量:first 和 second,其中的 first 对应的是 Key 且不可变,second 对应的是值 T,值是可变类型。

map 创建的键值对映射可以使用统一初始化列表 {{键1, 值1}, {键2, 值2}, {键3, 值3}, ...} 进行初始化。如:

std::map<std::string, int> m{{"CPU", 10}, {"GPU", 15}, {"RAM", 20}};

常用的成员函数

成员函数
说明
map
构造函数。
~map
析构函数。
operator=
赋值。
元素访问相关成员函数
at
访问指定元素,带检查边界。
operator[]
访问或者插入指定元素。
容量相关成员函数
empty
判断是否为空
size
返回数据元素个数
max_size
返回可能存储的最大数据元素个数。
修改相关成员函数
clear
清空数据。
insert
插入数据
emplace(C++11)
使用构造对象替换
erase
删除数据
swap
交换两个容器内容
查找相关成员函数
count
返回指定键匹配成功的数量。
find
查找指定的键。
迭代器相关成员函数
begin 或 cbegin(C++11)
返回容器数据开始位置的迭代器
end或cend(C++11)
返回容器数据结束位置的迭代器(最后一个元素的后面)
rbegin或crbegin(C++11)
返回反向迭代器的起始位置(最后一个元素)
rend或 crend(C++11)
返回反向迭代器的结束位置(第一个元素的前一位置)

以上函数只给出了函数名,以上函数大多数都有重载,具体请查看官方文档.

参考文档

https://en.cppreference.com/cpp/container/map

非成员函数

操作
说明
operator==
比较两个容器是否相同。
std::swap
交换两个同类型的容器内容。

示例

// filename: mymap.cpp
#include <iostream>
#include <map>

int main(int argc, char * argv[]) {
    // 创建一个含义三个 (string, int) 类型的键值对映射存储三个学生的姓名和成绩。
    std::map<std::string, int> m{{"Zhang3", 61}, {"Li4", 89}, {"Wang5", 36}};

    // 打印三个键值对信息:(C++98 的用法)
    for (std::map<std::string, int>::const_iterator it = m.begin();
             it != m.end(); ++it)
        std::cout << it->first << " = " << it->second << "; ";
    std::cout << std::endl;  // 换行

    m["Wang5"] = 60;  // 修改Wang5 的新成绩为 60
    m["zhao6"] = 100; // 插入一个新的键值对,键为 "zhao6",值为 100

    // 打印键值对信息:(C++11 的用法)
    for (auto it = m.begin(); it != m.end(); ++it)
        std::cout << it->first << " = " << it->second << "; ";
    std::cout << std::endl;  // 换行

    // 使用 operator[] 访问一个已经存在的 学生的成绩
    std::cout << "m[\"Zhang3\"] : " << m["Zhang3"] << std::endl;

    // 删除 li4 的键值对。
    m.erase("li4");
    // 打印键值对信息:(C++11 的 范围 for 语句的用法)
    for (const auto& n : m)
        std::cout << n.first << " = " << n.second << "; ";
    std::cout << std::endl;  // 换行

    m.clear();  // 清空键值对
    std::cout << std::boolalpha << "map 是空的: " << m.empty() << std::endl;

    return 0;
}

编译和运行结果如下:

weimz@mzstudio:~$ g++ -o mymap mymap.cpp
weimz@mzstudio:~$ ./mymap
Li4 = 89; Wang5 = 36; Zhang3 = 61;
Li4 = 89; Wang5 = 60; Zhang3 = 61; zhao6 = 100;
m["Zhang3"] : 61
Li4 = 89; Wang5 = 60; Zhang3 = 61; zhao6 = 100;
map 是空的: true