STL【map】

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,空间是这样的:

stringint
abab0
bdac90
jhbfjdhg&%jkbfe211
……………………

这种类型的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;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值