map
map翻译为映射,我们之前所用到的int就是一个int 对int的映射,我们还用到过char ,float,double,string…这都是int转换各个类型的映射。
使用map可以将任意类型的基本类型建立映射映射到任意基本类型,都包括stl的容器
若要使用map需要添加map头文件除此之外还要添加using namespace std;
我们可以看map的一些常用用法
1.map定义
map和其他容器不一样的就是map需要提供映射前类型和映射后类型,所以需要在<>中写两个类型,例如<键类型,值类型>
如果我要使用一个字符串到整形的映射就要做成
map<string,int> mp;
因为是要作为字符串与整形的映射所以不可以用char只能用string
键值还可以是stl容器所以也可以这么写
map<set<int>,string> mp;
2.map容器内元素访问
(1).通过下标访问
和访问普通数组一样建立映射后就可进行访问(map的键值是唯一的)
例如
#include<iostream>
#include<map>
using namespace std;
int main()
{
map<char,int> mp;
mp['c']=20;
mp['c']=30;
cout<<mp['c']<<endl;
return 0;
}
//输出结果为30
(2).通过迭代器访问
map访问迭代器和stl中其他类似
map<char,int>::iterator it;
map迭代器不同的地方就是能访问两个值,所以决定了一个it可以返回键和值,it->first访问键,it->second访问值
例如
#include<iostream>
#include<map>
using namespace std;
int main()
{
map<char,int> mp;
mp['m']=20;
mp['r']=30;
mp['f']=40;
for(map<char,int>::iterator it=mp.begin();it!=mp.end();it++)
{
cout<<it->first<<' '<<it->second<<endl;
}
return 0;
}
/*
结果为
f 40
m 20
r 30
*/
看到结果后发现map会以键值由大到小进行排序,因为这是由于map内部由红黑树实现,在建立映射过程中由从小到大的排序功能
3.map常用函数
(1)find()
find()返回key为键的映射的迭代器时间复杂度为O(logN),N为map映射的个数
mp['a']=1;
mp['b']=2;
map<char,int>::iterator it=mp.find('b');
cout<<it->second<<endl;
//会输出 2
(2)erase()
和其他基本类似有两种用法删除单个元素或者删除一个区间的元素
1.删除单个it为迭代器
mp['a']=1;
mp['b']=2;
map<char,int>::iterator it=mp.find('b');
mp.erase(it);
//删除 b 2
删除一个元素,key是键值
mp['a']=1;
mp['b']=2;
mp.erase('b');
//删除了 b 2
2.删除一个区间的元素mp.erase(first,last),删除的是[first,last)。复杂度为O(last-first)
mp['a']=1;
mp['b']=2;
mp['c']=3;
map<char,int>::iterator it=mp.find('b');
mp.erase(it,mp.end);
//删除了b 2和c 3
(3)size()
返回map中映射的对数时间复杂度为O(1)
(4)clear()
清空map中的所有元素复杂度为O(N),N为元素个数
map的用途
1.大整数建立表的时候用字符串代替
2.要求建立字符串与数字的关系时
3.字符串和字符串的映射可能会用到
eg:C++11中还增加了unordere_map,以散列替代内部红黑树,可以只处理映射不排序,速度要远快于map,有兴趣可以自行了解哦