进阶C++STL之map

Posted 信息学竞赛从入门到巅峰

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了进阶C++STL之map相关的知识,希望对你有一定的参考价值。


上期向大家介绍了C++中最常用的STL之一,set。今天,我向大家介绍一种与set相似的STL——map。
map,可以被理解为一个二元组的集合。这个二元组中,第一关键字(第一个元素)用于排序,作为集合的“识别符”。第二关键字是这个二元组的值,每一个“识别符”对应着一个值。因此,map也可以理解成一系列的映射关系,从第一种数据类型映射到第二种数据类型。

头文件
#include <map> /* map需要的头文件 */

定义方式
map <type1, type2> name; /* 定义一个名称为name,第一个关键字的类型为type1,第二个关键字的类型为type2的map */
/* 例子 */map <int, int> q; map <intlong long> abc;map <string, double> q;
需要注意的是,map的第一个关键字需要支持小于号操作。如果是自己定义的结构体,需要重载小于号操作。

迭代器
map <tpye1, type2> :: iterator name;/* 定义了一个对应类型的map的迭代器,但是没有指向的目标 */
q.begin(); /* 名称为q的map的第一个元素 */q.end(); /* 名称为q的map的最后一个元素的下一个位置 */
/* 例子 */map <intdouble> q;/* 通过一系列操作往q中加入元素 */map <intdouble> :: iterator it = q.begin();it -> first; /* 访问第一个元素的第一关键字 */it -> second; /* 访问第一个元素的第二关键字 */
迭代器可以理解为一个指针。与set不同的是,由于map储存的是一个二元组,所以指针指向的是一个pair,而不是一个元素。假设迭代器的名称为it,可以通过 it->first 访问第一个关键字,可以通过 it->second 访问第二个关键字。

函数
q.insert(make_pair(xy)); /* 插入一个二元组 */q.find(x); /* 返回第一关键字为x的迭代器,如果不存在返回q.end() */q.erase(it); /* 删除对应的迭代器 */q.erase(q.find(x)); /* 删除x所在的二元组 */q.clear(); /* 将q清空 */q.empty(); /* 询问q中是否为空,如果为空返回true,否则返回false */q.lower_bound(x); /* 返回第一个第一关键字大于等于x的二元组的迭代器 */q.upper_bound(x); /* 返回第一个第一关键字大于x的二元组的迭代器 */
/* map还可以通过[]的形式进行访问,以下假设q为一个map */q[0] /* 返回第一关键字为0的二元组对应的第二关键字 */q[x] /* 返回第一关键字为x的二元组对应的第二关键字 */
/* 同理,map也可以使用类似数组的方式进行修改 */q[0] = 1.1/* 将第一关键字为0的二元组的第二关键字修改为1.1 */q["abc"] = 10; /* 将第一关键字为"abc"的二元组的第二关键字修改为10 */

时间复杂度
insert
find
erase
lower_bound
upper_bound
O(log n) O(log n)
O(log n)
O(log n)
O(log n)

总结
map与set的很多操作都是类似甚至相同的。值得注意的是,map里存放的是一个二元组,而不是一个元素。
 



内容下至信息学竞赛,上达自然语言处理,应有尽有。

喜欢就关注吧

以上是关于进阶C++STL之map的主要内容,如果未能解决你的问题,请参考以下文章

C++STL之map和set的使用

STL 之 hash_map源代码剖析

C++STL之map详解

STL之map

6-6-2:STL之map和set——map的基本使用

6-6:STL之map和set