转载自:https://blog.csdn.net/liitdar/article/details/80009712
本文主要介绍map的概念及用法。
1. 概念
map是STL的一个关联容器,它提供一对一的数据处理能力。
map对象是模板类,需要关键字和存储对象两个模板参数,其中第一个参数称为关键字,每个关键字只能在map中出现一次;第二个参数称为该关键字的值,可理解为“{键,值}对”。例如,学生的“学号”与“姓名”就可以用map进行描述,“学号”对应“关键字”,“姓名”对应“值”,具体的map描述如下:
std::map<int, string> mapStudent;
map内部数据的组织:map内部自建一颗红黑树(一种非严格意义上的平衡二叉树),这颗树具有对数据自动排序的功能,所以在map内部所有的数据都是有序的。
上面语句定义了一个用int作为索引(关键字),并拥有相关联的指向string的指针。为了使用方便,我们可以对模板类使用typedef进行下面的类型定义:
-
typedef
map<
int,
string> mapStudent_t;
-
mapStudent_t mapStudent;
2. 常见用法
2.1 map构造函数
map提供了几种构造函数,通常我们采用下面的方式构造map:
-
typedef
map<
int,
string> mapStudent_t;
-
mapStudent_t mapStudent;
2.2 map的数据插入操作
对于数据插入操作,map也提供了多种方法,常见的插入操作方式如下:
-
mapStudent.insert(pair<
int,
string>(
1,
"zhao"));
-
mapStudent.insert(pair<
int,
string>(
2,
"qian"));
-
mapStudent.insert(pair<
int,
string>(
3,
"sun"));
2.3 map中数据的遍历
我们可以通过使用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数据类型包括下面的两个数据:
- iterator->first 关键字(key)
- iterator->second 存储的数据(value)
2.4 map中数据的查找
我们可以通过使用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<string, string>("zhao", "zhaoyun"));
如果要查找该map的value,必须在find函数中输入完整的key作为入参、即“zhao”才行,如果输入的入参为“zh”、或“zha”,则都不能找到该map的value。
2.5 map中数据的删除
对于map中数据的删除,可以分为如下两种情况:
a)如果想要清空map中的所有数据,可以使用clear函数;
b)如果想要删除map中的指定数据,可以通过使用map的迭代器iterator、调用erase函数来实现,如下:
-
// 删除
-
iter = mapStudent.find(
3);
-
mapStudent.erase(iter);
2.6 map中数据的排序
map中的所有元素都会根据元素的键值,自动进行升序排序。3. 示例程序
-
#include <iostream>
-
#include <map>
-
#include <string>
-
-
using
namespace
std;
-
-
int main()
-
{
-
typedef
std::
map<
int,
string> mapStudent_t;
-
mapStudent_t mapStudent;
-
-
mapStudent.insert(pair<
int,
string>(
1,
"zhao"));
-
mapStudent.insert(pair<
int,
string>(
2,
"qian"));
-
mapStudent.insert(pair<
int,
string>(
3,
"sun"));
-
-
// 遍历
-
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;
-
}
-
-
// 查找
-
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;
-
}
-
-
// 删除
-
iter = mapStudent.find(
3);
-
mapStudent.erase(iter);
-
-
// 再次遍历,观察删除操作是否成功
-
cout <<
"after delete, content of map as followed: " <<
endl;
-
for (iter = mapStudent.begin(); iter != mapStudent.end(); iter++)
-
{
-
cout << iter->first <<
" " << iter->second <<
endl;
-
}
-
-
return
0;
-
}
上述代码运行结果如下: