map的主要功能是映射,它可以将任何基本类型(包括STL容器)映射到任何基本类型(包括STL容器)
- 在使用map的时候需要添加map的头文件,即
#include<map>
1. map的定义
单独定义一个map :
map<typename1, typename2> mp;
map需要映射前的(键key)和映射后的类型(值value),所以需要在<>内填写两个类型,其中第一个是键的类型,第二个是值的类型。如果是字符串到整型的映射,必须使用string而不能使用char数组(char作为数组是不能被作为键值的):
map<string, int> mp;
2. map容器内元素的访问:
两种方式访问:
- 1.通过下标访问:
和普通的数组一样,但是同时map中的键是唯一的。在以下的代码中,mp[‘C’]的输出最终是2。
#include<iostream>
#include<map>
using namespace std;
int main()
{
map<char, int> mp;
mp['C'] = 1;
mp['C'] = 2;
cout << mp['C'] << endl;
return 0;
}
- 2.通过迭代器访问
map迭代器的定义方式:
map<typename1, typename2>::iterator it;
通过使用it->first
来访问键,通过it->second
来访问值
#include<iostream>
#include<map>
using namespace std;
int main()
{
map<char, int> mp;
mp['C'] = 1;
mp['B'] = 1;
mp['A'] = 1;
map<char, int>::iterator it;
for(it = mp.begin(); it != mp.end(); it ++)
cout << it->first << " " << it->second << endl;
return 0;
}
同时,map会以键从小到大的顺序自动排序,因为 map 内部是使用红黑树来实现(set也是),在建立映射的时候会自动实现从小到大的排序功能。
3.map 常用函数实例分析:
1. find()
find(key)
返回键为 key 的映射的迭代器,时间复杂度为
O
(
l
o
g
N
)
O(log^N)
O(logN),N为map中的映射个数。例子:
#include<iostream>
#include<map>
using namespace std;
int main()
{
map<char, int> mp;
mp['C'] = 1;
mp['B'] = 1;
mp['A'] = 1;
map<char, int>::iterator it = mp.find('A');
cout << it->first << " " << it->second << endl;
return 0;
}
如果find()
没有找到相应的key,会返回mp.end()
2. erase()
erase()
有两种用法:删除单个元素,删除一个区间内所有的元素。
删除单个元素有两种方法:
mp.erase(it)
it 为需要删除元素的迭代器。时间复杂度为 O ( 1 ) O(1) O(1)mp.erase(key)
key为欲删除元素的键。时间复杂度为 O ( l o g N ) O(log^N) O(logN) N为map内元素的个数。
删除一个区间内所有的元素:
mp.erase(first, last)
,其中first为所要删除区间的起始迭代器,而last则为需要删除区间的末尾迭代器的下一个地址。删除左闭右开的区间[first, last),时间复杂度为
O
(
l
a
s
t
−
f
i
r
s
t
)
O(last - first)
O(last−first) 例子:
#include<iostream>
#include<map>
using namespace std;
int main()
{
map<char, int> mp;
mp['C'] = 1;
mp['B'] = 1;
mp['A'] = 1;
map<char, int>::iterator it = mp.find('B');
mp.erase(it, mp.end());
for(auto it = mp.begin(); it != mp.end(); it++) cout << it->first << " " << it->second << endl;
return 0;
}
输出: A 1
3. size()
用来获得map中映射的对数,时间复杂度为 O ( 1 ) O(1) O(1)。例子:
#include<iostream>
#include<map>
using namespace std;
int main()
{
map<char, int> mp;
mp['C'] = 1;
mp['B'] = 1;
mp['A'] = 1;
cout << mp.size() << endl;
return 0;
}
输出:3
4. clear()
用来清空map中所有的元素,复杂度为 O ( N ) O(N) O(N),其中N为map中元素的个数。
#include<iostream>
#include<map>
using namespace std;
int main()
{
map<char, int> mp;
mp['C'] = 1;
mp['B'] = 1;
mp['A'] = 1;
cout << "before: "<< mp.size() << endl;
mp.clear();
cout << "after: " << mp.size() << endl;
return 0;
}
输出:
before: 3
after: 0
4. map的常见用途:
- 需要建立字符(或字符串)与整数之间映射的题目,使用map可以减少代码量。
- 判断大整数或其他类型数据是否存在的题目,可以把map当作bool数组使用。
- 字符串和字符串的映射。
另外,map的键和值是唯一的,如果一个键要对应多个值,只能用multimap。另外C++中还增加了unordered_map,以散列代替map内部红黑树的实现,使其可以用来只映射不按照key排序的需求速度比map快很多。