关于map的应用的小题

在这是这里插入图片描述上面是题目,下面是代码和注释。map的中文名叫映射,存放数量可变的数据对,key与value,其类型可以自由定义。这道题看似很简单,但是由于题意中的数据范围实在太大了,不适合开数组来解,适合大小可变的容器,又由于每个数有两个值需要记录(值和出现的次数),所以map最合适。解题思路是用map来存输入的值作为key,重复出现的次数为value,当value被定义为int型时默认初始值为0。可以象数组那样使用自增来计数,也可以用inser()函数插入。但是用inser()函数更新之前,需要调用erase()函数擦除之前的数据对,否则更新不了。这个是我调了很久bug才发现的,多么痛的领悟。最后把map按照value的值降序排序,可是map是默认按照key升序排序,map也传不进sort()中去,只能开个vector数组装进去,再排序,其他博客关于map按照value排序的方法也大多是用vector装map再排序。

// Practice.cpp: 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include<iostream>
#include<map>
#include<vector>
#include<algorithm>
using namespace std;
bool cmp(const pair<long long, long long > &p1, const pair<long long, long long> &p2)//要用常数,不然编译错误 
{
	return p1.second>p2.second;	//为了按照value降序排列设计的cmp函数
}
int main()
{	
	map<long long, long long> s;
	map<long long, long long>::iterator it;
	long long n, temp, key, value;
	cin >> n;
	for (int i = 0; i < n; i++) {
		cin >> temp;
		it = s.find(temp);
		if (it == s.end()) {
			s.insert(pair<long long, long long>(temp, 1));
		}
		else if (it != s.end()) {
			value = s[temp];
			++value;
			s.erase(it);  //如果已经存在,重新写入前需要先将原数据对擦出
			s.insert(pair<long long, long long>(temp, value));
		}
	}
	/*for(int i=0;i<n;i++){  //其实上面复杂的写入map的写法可与改这样简洁的数组形式
		cin >> temp;	//s[]默认int会初始化为0,只需要自增就可以实现计数功能了
		s[temp]++;
	}*/

	/*for (it = s.begin(); it != s.end(); ++it) { //这是一个遍历输出map的,map默认
		cout << it->first << ends << it->second<<endl;  //按照key,的大小升序排列
	}*/
	
	vector<pair<long long, long long> > arr;
	for (it = s.begin(); it != s.end(); ++it)  //这是为了让map按照value的值
	{                                    //排序而写的vector数组,利用迭代器遍历map
		arr.push_back(make_pair(it->first, it->second));  //pair模板的特性是存first与second
	}
	sort(arr.begin(), arr.end(), cmp);
	cout << arr.begin()->second;
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值