#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 ");
}
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 ");
}
从本程序应该注意到:
- 在模板里面,要使用一个成员类型(比如T::value_type) ,必须在前面加个关键词typename,因为编译器不知道你指定的是一个值,还是类型
- 这个程序可以成为简单的算法,可以看出设计了好几个变量,例如当前位置,前一位置,最大位置等等,这些就是所谓的数据结构,只有数据结构设计的完善,算法才能顺序的编写