在定义一个浮点型数组时,其实是定义了一个int型到double型的映射。如array0=25.4就是将0映射到25.4。
但当要用数组来表示字符串映射到页码的关系时,就不好操作。因此引进map容器。
map容器可以将任何类型(包括STL容器)映射到任何类型(包括STL容器)。
同样,如果需要判断给定的一些数字(大整型数字)在某个文件中是否出现过,也可以使用map容器简历string至int的映射。
使用map需于代码头部添加#include<map>
,并且随后加上一句:using namespace std;
即可。
仅定义:map<typename1,typename2> mp;
前一个是键(Key)的类型,后一个是值(Value)的类型。
注意:(1)若是字符串映射到整型,则必须用string而不能用char数组,如map<string,int> mp;
(2)若键也是STL容器(STL容器嵌套),则需要在>>后加上空格(C++11之前标准的编译会将其视为移位操作)。即map<set<int>, int> mp;
,此处是将一个set容器映射到字符串。
定义:map<typename1, typename2>::iterator it;
map迭代器的使用方式和其他STL容器的使用方式不同。
map可以使用it->first来访问键,使用it->second来访问值
find(key):返回键为key的迭代器,时间复杂度为O(logN),N为map中映射的个数
map<char, int>::iterator it = mp.find('c');
prinf("%c %d\n", it -> first, it -> second);//输出c 30
mp.erase(it),it为需要删除的元素的迭代器,时间复杂度为O(1)
map<char, int>::iterator it = mp.find('m');
mp.erase(it);//删除m 20
mp.erase(key),key为与删除的映射的键,时间复杂度为O(logN),N为map内元素的个数
mp.erase('r');//删除r 30
mp.erase(first,last):first为需要删除的区间的起始迭代器,last为需要删除的区间的末尾迭代器的下一个地址,即为删除左闭右开的区间[first,last),时间复杂度为O(last-first)。
map<char, int>::iterator it3 = mp.find('y');
mp.erase(it3,mp.end());//删除it之后的所有映射,即y 25和z 10
clear(),时间复杂度为O(N),N为map中元素的个数
mp.clear();
size()用来获得map中映射的对数,时间复杂度为O(1)
printf("%d\n",mp.size());
#include<stdio.h>
#include<map>
using namespace std;
int main(){
map<char, int>mp;
//通过下标访问元素
mp['c'] = 20;
mp['c'] = 30;//被覆盖
printf("%d\n",mp['c']);
//通过迭代器访问
mp['z'] = 10;
mp['y'] = 25;
mp['m'] = 20;
mp['r'] = 30;
mp['a'] = 40;
for(map<char, int>::iterator it = mp.begin();it != mp.end(); it++){
printf("c %d\n",it -> first, it -> second);
//只有vector和string中,才允许使用迭代器加上整数的写法
//map会以键从小到大自动排序(因为map和set内部是使用红黑树实现的)
}
//查找元素(迭代器)
//find(key):返回键为key的迭代器,时间复杂度为O(logN),N为map中映射的个数
map<char, int>::iterator it1 = mp.find('c');
prinf("%c %d\n", it1 -> first, it1 -> second);//输出c 30
//删除单个元素
//mp.erase(it),it为需要删除的元素的迭代器,时间复杂度为O(1)
map<char, int>::iterator it2 = mp.find('m');
mp.erase(it2);//删除m 20
//mp.erase(key),key为与删除的映射的键,时间复杂度为O(logN),N为map内元素的个数
mp.erase('r');//删除r 30
//删除一个区间内的所有元素
//mp.erase(first,last)
//first为需要删除的区间的起始迭代器,last为需要删除的区间的末尾迭代器的下一个地址
//即为删除左闭右开的区间[first,last),时间复杂度为O(last-first)
map<char, int>::iterator it3 = mp.find('y');
mp.erase(it3,mp.end());//删除it之后的所有映射,即y 25和z 10
//清空元素:clear(),时间复杂度为O(N),N为map中元素的个数
mp.clear();
//获取长度:size()用来获得map中映射的对数,时间复杂度为O(1)
//printf("%d\n",mp.size());//输出2,表明还剩2对映射
}
(1)如果一个键需要对应多个值,只能使用multimap而不能使用map。
(2)C++11标准还增加了unordered_map,以散列替代map内部的红黑树实现,使其可以用来处理值只映射而不按key排序的需求,速度比map快很多。
版权所有:可定博客 © WNAG.COM.CN
本文链接:https://cloud.tencent.com/developer/article/1616898
特别声明:除特别标注,本站文章均为原创,本站文章原则上禁止转载,如确实要转载,请电联:wangyeuuu@qq.com,尊重他人劳动成果,谢过~