一、map函数
1、map的特点
map是STL的一个关联容器,原型是红黑树,调用需要用到迭代器
2、map的使用
(1)map的头文件
#include <map>
(2)map的定义
map<int,int> s;//第一个定义的是关键字,第二个是值,这里是定义了一个名为s的map
map<int,int>::iterator iter;//这里定义了一个名为iter的迭代器
//注意,迭代器与map定义的关键字和值的定义的类型要相同
(3)存入值到map中
s[x]++;//将s[]中x项+1个值
s[x]+=i;//将s[]中x项+i个值
//注:如果map中没有这一项,map会自己创建一个新的项
(4)读出map中的值
for(iter=s.begin();iter!=s.end();iter++){//iter是迭代器,用于定位map中值的位置
printf("%d %d\n",iter->first,iter->second);//first是项数,second是iter项的值
}
//次段代码意为,取出map中所有的项的项数和值
如:
5)读出map的长度
s.size();//跟求字符串长度差不多
应用题目
1、统计数字
题目
存限制:128 MiB
时间限制:1000 ms
输入文件:B.in
输出文件:B.out
题目类型:传统
评测方式:文本比较
题目描述
某次科研调查时得到了n个自然数,每个数均不超过1500000000。已知不相同的数不超过10000个,现在需要统计这些自然数各自出现的次数,并按照自然数从小到大的顺序输出统计结果。
输入格式
第1行为1个正整数n,表示有n个整数;
第2行有n个用空格隔开的自然数。
输出格式
由小到大输出每个数出现的次数。
样例
样例输入
8
2 4 2 4 5 100 2 100
样例输出
2 3
4 2
5 1
100 2
开始解题
读题后可得输入有两行,第一行一个数,表示输入的数量,第二行表示输入的n个自数。最后要输出每个数的个数,这里就可以用到map来存储,记录数和数量,用map会比数组更方便。
综上程序就可以先读入n,然后在用for循环来读入一个数x,接着把map中的x项++,最后用it迭代器把位置和数量取出就行了。
对了,这道题是文件输入输出,要用freopen
上代码
上代码
#include <bits/stdc++.h>
using namespace std;
map<int,int>m;//定义map
map<int,int>::iterator it;
int n,x;
int main()
{
freopen("B.in","r",stdin);//文件输入输出
freopen("B.out","w",stdout);
scanf("%d",&n);//读入n
for(int i=1;i<=n;i++){
scanf("%d",&x);//读入n个数
m[x]++;//将数存入map中
}
for(it=m.begin();it!=m.end();it++){
printf("%d %d\n",it->first,it->second);//输出数和数量
}
return 0;
}
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的函数
参考资料:
https://blog.youkuaiyun.com/sevenjoin/article/details/81943864?spm=1001.2014.3001.5506