C++ STL Map 容器
映射(map)是 C++ 标准模板库 STL 的一部分。映射是存储排序的键值对的关联集合,其中每个键都是唯一的,可以插入或删除但不能更改(与键关联的值可以更改)。
在 C++ STL 中,map 以模板(泛型)方式实现,可以存储任意类型的数据,包括使用者自定义的数据类型。Map 主要用于资料一对一映射(one-to-one)的情況,map 内部的实现是自建一颗红黑树,这颗树具有对数据自动排序的功能,所以在 map 内部所有的数据都是有序的。
map 映射
Map 是 STL 中的一个关联容器,它提供一对一的数据处理能力。其中,第一个称为关键字(key),每个关键字只能在 map 中出现一次,第二个称为该关键字的值(value)。
C++ STL 的 map 底层数据结构是用红黑树实现的,具有对数据自动排序的功能,所以在 std::map 内部所有的数据都是有序的,查找时间复杂度是 log(n)。
下面举例说明什么是一对一的数据映射。比如一个班级中,每个学生的学号跟他的姓名就存在着一一映射的关系,这个模型可以用 map 轻易描述:学号用 int 描述,姓名用 string 描述。如下:
map<int, string> mapStudent;
map 语法
使用 map 容器,必须先引入 <map> 头文件。
#include <map>
map 对象是模板类,需要关键字和存储对象两个模板参数。例如前面学生学号的例子:
std::map<int, string> mapStudent;
定义了一个用 int 作为索引,并拥有相关联的指向 string 的指针。
map 示例
下面演示如何创建和操作 map 容器。
#include <map>
#include <string>
#include <iostream>
using namespace std;
int main(void)
{
map<int, string> mapStudent;
// 使用 insert 函数插入 pair 数据
mapStudent.insert(pair<int, string>(1, "student_one"));
mapStudent.insert(pair<int, string>(2, "student_two"));
mapStudent.insert(pair<int, string>(3, "student_three"));
// 用 insert 函数插入 value_type 数据
mapStudent.insert(map<int, string>::value_type (1, "student_one"));
mapStudent.insert(map<int, string>::value_type (2, "student_two"));
mapStudent.insert(map<int, string>::value_type (3, "student_three"));
// 用数组方式插入数据
mapStudent[1] = "student_one";
mapStudent[2] = "student_two";
mapStudent[3] = "student_three";
cout << "The size of map is: " << mapStudent.size() << endl;
map<int, string>::iterator iter;
for(iter = mapStudent.begin(); iter != mapStudent.end(); iter++)
{
cout << iter->first<< ": " << iter->second << endl;
}
return 0;
}
执行 g++ main.cpp && ./a.out 编译运行以上程序,输出结果如下:
The size of map is: 3
1: student_one
2: student_two
3: student_three
示例代码中提供了三种插入数据的方法,但是它们是有区别的。当然,第一种和第二种在效果上是完成一样的,用 insert() 函数插入数据,在数据的插入上涉及到集合的唯一性这个概念,即当 map 中有这个关键字时,insert 操作是不能插入数据的。但是用数组方式就不一样,它可以覆盖以前该关键字对应的值。
map 函数列表
以下是 map 的所有成员函数的列表。