使用template编写程序:查找序列中出现最频繁的元素,返回其值

#include<iostream>
using  namespace std;
#include<vector>
#include<algorithm>

// 写一个函数模板,找出一段迭代器元素中,出现最频繁的元素
template <typename T>
// 返回出现最频繁的元素的值
typename T::value_type maxFreVal(T beg, T end){
    typedef vector<typename T::value_type> vecType;

     // 首先,建立一个vector,保存迭代器的副本
    vecType vec(beg, end);

     // 排序,让相同的元素放在一起
    sort(vec.begin(), vec.end());
    
    vecType::iterator
        newFirst = vec.begin() // 存放新容器的首地址
        , newLast = vec.end() //
        , maxPos = newFirst // 保存迭代器的初始位置
        , prePos = newFirst; // 保存当前位置的前一个位置,用于比较
    
    
// 声明数据结构,就是存储这些需要的数据的变量
    std::size_t maxCount= 0, currCount= 0; // 最大出现次数,当前出现次数
     for(; newFirst!=newLast; ++newFirst){
         if(*prePos!=*newFirst){
             // 说明遇到了新值
             if(currCount>maxCount){
                maxCount = currCount;
                maxPos = prePos;
            }
             // 计数器清零
            currCount =  0;
        }
         // 没有遇到新值,只加增加计数
        ++currCount;

        prePos = newFirst; // 推进当前值和前一值
    }
     // 说明遇到了新值 // 出现了临界情况,最后一次没有判断
     if(currCount>maxCount){
        maxCount = currCount;
        maxPos = prePos;
    }
     return *maxPos;
}

void main(){
     // vector<int> v;
    
// vector<int>::iterator::value_type vtype;
    
// cout<<vtype<<endl;

    vector< int> v;
    v.push_back( 1);
    v.push_back( 3);
    v.push_back( 6);
    v.push_back( 1);
    v.push_back( 2);
    v.push_back( 6);
    v.push_back( 5);
    v.push_back( 2);
    v.push_back( 3);
    v.push_back( 6);
    v.push_back( 5);
    v.push_back( 2);
    v.push_back( 4);
    v.push_back( 2);
    v.push_back( 6);
    
    v.push_back( 6);
    v.push_back( 6);

     // vector<int> v1(v.begin(), v.end());
    
// cout<<v1.size()<<endl;
    cout<<maxFreVal(v.begin(), v.end())<<endl;
    system( " pause ");


从本程序应该注意到:

  1. 在模板里面,要使用一个成员类型(比如T::value_type) ,必须在前面加个关键词typename,因为编译器不知道你指定的是一个值,还是类型
  2. 这个程序可以成为简单的算法,可以看出设计了好几个变量,例如当前位置,前一位置,最大位置等等,这些就是所谓的数据结构,只有数据结构设计的完善,算法才能顺序的编写

转载于:https://www.cnblogs.com/crazyant/archive/2011/08/25/2152822.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值