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;
说明:
Key是键的类型。T是值的类型。Compare是用来将键做比较的比较器,默认为std::less<Key>,无特殊需求无需改动。Allocator是内存分配器。
映射 存储的信息是 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