Map是c++的一个标准容器,她提供了很好一对一的关系,每对的第一个值称之为关键字(key),每个关键字只能在map中出现一次;第二个称之为该关键字的对应值;在一些程序中建立一个map可以起到事半功倍的效果。
map的构建:
#include<map>
int main()
{
//map构建格式:map<数据类型,数据类型> 名称;
map<int,int> mpl1;
map<string,int> mpl2;
map<char,int> mpl3;
mpl<string,string> mpl4;
…………
}
一个<string,int>类型的map,空间是这样的:
string | int |
abab | 0 |
bdac | 90 |
jhbfjdhg&%jkbfe | 211 |
………… | ………… |
这种类型的map就可以这样赋值:
mpl["abcd"]=1234;
这时,“abcd”被称为关键字,1234则称为关键字“abcd”的对应值,其他类型类同。
map添加数据:
//定 义 :
map<int ,string> maplive;
//第一种方式:
maplive.insert(pair(102,"aclive"));
//第二种方式:
maplive.insert(map::value_type(321,"hai"));
//第三种方式:
maplive[112]="April"; //map中最简单最常用的插入添加!
这三种方法中,我们一般使用第1种和第3种(装逼建议用第2种qwq),这两种方法也有不同之处,第三种方法会把原本的对应值覆盖掉,而第一种如果检测到该关键字已存在,就不会覆盖对应值,即操作无效。
map数据的调用:
cout<<mpl["abcd"]; //像数组一样调用,非常方便
map中元素的查找:
find()函数返回一个迭代器指向键值为key的元素,如果没找到就返回指向map尾部的迭代器。
(什么是迭代器?就是特殊的指针,指向STL模板中的元素)
map<int ,string >::iterator l_it; //迭代器
l_it=maplive.find(112);
if(l_it==maplive.end()) cout<<"we do not find 112"<<endl;
else cout<<"wo find 112"<<endl;
“ maplive.end()”就是指这个map最尾部的一个特殊迭代器,不储存数据,只用来代表map结束。
map中元素的删除:
如果删除112:
map<int ,string >::iterator l_it;
l_it=maplive.find(112);
if(l_it==maplive.end())cout<<"we do not find 112"<<endl;
else maplive.erase(l_it); //delete 112;
map中的元素是按关键字进行自动排序的,所以不能对map使用sort。
map的基本函数:
begin() 返回指向map头部的迭代器
clear() 删除所有元素
count() 返回指定元素出现的次数
empty() 如果map为空则返回true
end() 返回指向map末尾的迭代器
equal_range() 返回特殊条目的迭代器对
erase() 删除一个元素
find() 查找一个元素
get_allocator() 返回map的配置器
insert() 插入元素
key_comp() 返回比较元素key的函数
lower_bound() 返回键值>=给定元素的第一个位置
max_size() 返回可以容纳的最大元素个数
rbegin() 返回一个指向map尾部的逆向迭代器
rend() 返回一个指向map头部的逆向迭代器
size() 返回map中元素的个数
swap() 交换两个map
upper_bound() 返回键值>给定元素的第一个位置
value_comp() 返回比较元素value的函数
好好消化,相信你可以的qwq!
map是STL中最好用的容器之一,在各种题目中都有用武之地,因此,掌握好map是很重要的。
【map】【NOIP2007提高组题一】统计数字
某次科研调查时得到了n个自然数,每个数均不超过1500000000(1.5*10^9)。已知不相同的数不超过10000个,现在需要统计这些自然数各自出现的次数,并按照自然数从小到大的顺序输出统计结果。
输入
输入包含n+1行;
第一行是整数n,表示自然数的个数;
第2~n+1每行一个自然数。
输出
输出包含m行(m为n个自然数中不相同数的个数),按照自然数从小到大的顺序输出。每行输出两个整数,分别是自然数和该数出现的次数,其间用一个空格隔开。
输入样例 1
8 2 4 2 4 5 100 2 100输出样例 1
2 3 4 2 5 1 100 2【限制】
40%的数据满足:1<=n<=1000
80%的数据满足:1<=n<=50000
100%的数据满足:1<=n<=200000,每个数均不超过1500 000 000(1.5*10^9)
AC代码如下:
#include<iostreeam>
#include<map>
using namespace std;
int main()
{
map<int, int> mpl;
int n,a,i;
cin>>n;
for(i=1;i<=n;i++)
{
cin>>a;
mpl[a]++;
}
map<int, int>::iterator iter; //迭代器
for(iter = mpl.begin(); iter != mpl.end(); iter++) //迭代器指向map的第一个元素
//iter++指向map的下一个元素
cout<<iter->first<<" "<<iter->second<<endl; //遍历整个map
//iter->first指的是关键字,iter->second指的是对应值
return 0;
}