【C++】map统计元素个数并且排序,用三种方法实现

我在上篇博客中讲到,map的主要特点是 会将所有键值对按key 值升序排列 且map中的key值不允许重复, 了解更多关于map 和multimap 的知识的可以查看这篇博客:STL进阶之树形的关联式容器——map和multimap

下面我们就用map 的接口实现< k,v >模型中以key为关键字的排序

1. find(key) + iterator insert(iterator position,make_pair())

原理:find(key)可返回查找key 后迭代器的位置,insert可插入迭代器的参考位置
故先用find查找map 内含key的键值对,若找到就直接修改该位置的value值,若没有找到则需要在这个参考位置用insert 插入新的键值对(make_pair())

代码如下:

#include <iostream>
#include <string>
#include <map>
using namespace std;
void Test1()
{
	string strs[] = { "a", "a", "f", "i", "c", "c", "b" };
	map<string, int> countmap;
	for (const auto&e : strs)     //遍历strs,统计结果放入map中
	{
		map<string, int>::iterator it = countmap.find(e);
		if (it != countmap.end())    //map中存在key
		{
			it->second++;
			cout<<"已有key值"<<e<<",value加1操作"<<endl;
		}
		else                         //map中不存在key
		{
			cout<<"没有key值"<<e<<",插入操作"<<endl;
			countmap.insert(make_pair(e, 1));
		}   
	}
	cout<<endl<<"统计结果如下:"<<endl;
	map<string, int>::iterator cit = countmap.begin();  //遍历打印
	while (cit != countmap.end())
	{
		cout<< cit->first << ":" << cit->second << "     ";
		++cit;
	}
}

在这里插入图片描述

2. pair <iterator,bool> + insert(make_pair())

原理:此函数会主动判断插入key值是否成功,并将结果放在bool中
所以我们不需要用find 进行判断,直接用bool的结果进行操作,若bool==true 则表明插入成功,若bool ==false 则表明已插入过一次只需修改value值即可

代码如下:

void Test2()
{
	string strs[] = { "a", "a", "f", "i", "c", "c", "b" };
	map<string, int> countmap;
	for (const auto& e : strs)
	{
		pair<map<string, int>::iterator, bool> ret = countmap.insert(make_pair(e,1));    //bool==true则插入成功
		if (ret.second == false)       //如果含key 的键值对已经存在,则只修改value 的值
		{
			ret.first->second++;
			cout<<"已存在key值"<<e<<",只修改value+1"<<endl;
		}
	}
	cout<<endl<<"统计结果如下:"<<endl;
	map<string, int>::iterator cit = countmap.begin();        //遍历打印
	while (cit != countmap.end())      
	{
		cout << cit->first << ":" << cit->second << "     ";
		++cit;
	}
}

在这里插入图片描述

3. operator [ ]

原理:m[key] 会直接返回key 对应的value值
所以若key对应的value 值已经存在则被修改,若未存在就会自动插入

代码如下:

void Test3()
{
	string strs[] = { "a", "a", "f", "i", "c", "c", "b" };
	map<string, int> countmap;
	for (const auto&e : strs)
	{
		countmap[e]++; //存在则直接进行++操作,不存在则先插入(默认value=0)再++           
	}
	map<string, int>::iterator cit = countmap.begin();       //遍历打印
	while (cit != countmap.end())
	{
		cout << cit->first << ":" << cit->second <<"    ";
		++cit;
	}
}

在这里插入图片描述

这里,大家可以思考一下。为什么multimap 中没有[ ] 操作符?

其实是因为multimap 与map 的最本质上的特点的不同导致的,因为multimap允许key值重复,那么我们使用multimap[key]就没法得到唯一的value结果,当然就没法用[]操作符进行某个元素的访问或者其他操作了。
想不起来二者有什么不同的可以查看我上篇博客最后的小结:STL进阶之树形的关联式容器——map和multimap

  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值