16.12

//编写一个函数模板,接受表示未知类型迭代器的一对值,找出序列中出现得最频繁得值
#include<iostream>
#include<tchar.h>
#include<string>
using namespace std;
template<typename t> t::value_type mostf(t first, t last)
{
	//计算需要分配内存得大小
	std::size_t amount = 0;
	t start = first;
	while (start != last)
	{
		amount++;
		start++;
	}
	//定义类型别名
	typedef std::vector<typename t::value_type>vectype;
	//创建vector对象,用于保存输入序列得副本
	vectype vec(amount);
	vectype::iterator newfirst = vec.begin();
	vectype::iterator newlast = vec.end();
	//将输入序列复制到vector对象
	std::_uninitialized_copy(first, last, newfirst);
	std::sort(newfirst, newlast);//对副本序列排序,使得相同得值出现再相邻位置
	std::size_t maxoccu = 0, occu = 0;//出现最频繁得次数,当前值得出现次数
	vectype::iterator prelter = newfirst;//指向当前值得前一个值
	vectype::iterator maxoccuelement = newfirst;//指向当前出现最频繁得值
	while (newfirst != newlast)
	{
		if (*newfirst != *prelter)//当前值与前一个值不同
		{
			if (occu > maxoccu)//当前值得出现次数卫目前最大次数
			{
				maxoccu = occu;//修改最大次数
				maxoccuelement = prelter;//修改指向当前出现最频繁得值得迭代器
			}
			occu = 0;
		}
		++occu;
		prelter = newfirst;
		++newfirst;
	}
	//最后一个值得出现次数与当前得最大次数进行比较
	if (occu > maxoccu)
	{
		maxoccu = ocuu;
		maxoccuelement = prelter;
	}
	return *maxoccuelement;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值