本文主要介绍 C++ 编程语言的 STL(Standard Template Library) 中 map 的相关知识,同时通过示例代码介绍 map的使用方法。
map 是 STL 的一个关联容器,它提供一对一的数据处理能力。
map 对象是模板类,需要关键字和存储对象两个模板参数:其中第一个参数称为关键字,每个关键字只能在 map 中出现一次;第二个参数称为该关键字的值。可以将关键字和存储对象理解为“{键,值}对”。例如,学生的“学号”与“姓名”就可以用 map 进行描述,“学号”对应“关键字”,“姓名”对应“值”,具体的 map 描述信息如下:
std::map mapStudent;
map 内部数据的组织:map 内部自建一颗红黑树(一种非严格意义上的平衡二叉树),这颗树具有对数据自动排序的功能,所以在 map 内部所有的数据都是有序的。
上面语句定义了一个用 int 作为索引(关键字),并拥有相关联的指向 string 的指针。为了使用方便,可以对模板类使用 typedef 进行下面的类型定义:
typedef map mapStudent_t;
mapStudent_t mapStudent;
map 提供了几种构造函数,通常采用下面的方式构造 map:
typedef map mapStudent_t;
mapStudent_t mapStudent;
对于数据插入操作,map 提供了多种方法。
mapStudent.insert(pair(1, "zhao"));
mapStudent.insert(pair(2, "qian"));
mapStudent.insert(pair(3, "sun"));
mapStudent[1] = "zhao";
mapStudent[2] = "qian";
mapStudent[3] = "sun";
说明:上面的两种方法是有区别的,用 insert 函数插入数据,涉及到集合的唯一性这个概念,即当 map 中有这个关键字时,insert 操作是不能实现数据插入的;但是数组方式能够插入数据,插入的数据会覆盖该关键字之前对应的值。
可以通过map 的迭代器 iterator、调用 map 对象的 begin() 和 end() 函数,实现对于 map 中数据的遍历,用法示例如下:
// 遍历
cout << "content of map as followed: " << endl;
mapStudent_t::iterator iter;
for (iter = mapStudent.begin(); iter != mapStudent.end(); iter++)
{
? ? cout << iter->first << " " << iter->second << endl;
}
说明:
1)begin() 和 end() 两个成员函数,分别对应map 对象中第一个数据条目和最后一个数据条目,这两个数据条目的类型是 iterator;
2)通过 map 对象的方法获取的 iterator 数据类型是一个 std::pair 对象,iterator 数据类型包括下面两个数据:
可以通过使用 map 的迭代器 iterator、调用 find 函数(传入的参数为要查找的 key),来查找定位 map 中的指定数据,用法示例如下:
// 查找
iter = mapStudent.find(2);
if (iter != mapStudent.end())
{
cout << "Find it, the relative value is: " << iter->second << endl;
}
else
{
cout << "Can not find the relative value." << endl;
}
说明:find 函数的入参为 map 结构的 key,并且入参必须完全匹配map 的 key,才能找到对应的 value。例如,对于以下 map 结构:
mapStudent.insert(pair("zhao", "zhaoyun"));
如果要查找该 map 的 value,必须在 find 函数中输入完整的 key (即“zhao”)作为入参才行,如果输入的入参为“zh”、或“zha”,都不能找到该 map 的 value。
对于 map 中数据的删除操作,可以分为如下两种情况:
a)如果想要清空 map 中的所有数据,可以使用 clear 函数;
b)如果想要删除 map 中的指定数据,可以通过使用 map 的迭代器 iterator、调用 erase 函数来实现,用法示例如下:
// 删除
iter = mapStudent.find(3);
mapStudent.erase(iter);
map 中的所有元素都会根据元素的键值,自动进行升序排序。
此处展示一个输出 map 结构内容的示例代码。代码(map_test1.cpp)内容如下:
#include
#include
编译并执行上述代码,结果如下:
示例代码(map_test2.cpp)内容如下:
#include
#include
上述代码运行结果如下: