请大家重点看freqMap()函数部分,
我的代码是<<Thinking in C++>>第二卷中的一道练习题,我发出来与大家分享:
该题主要实现对一个文件内的,ASCII字符数量进行统计。并将结果输出到 outMap文件。
#include <map>
#include <vector>
#include <iostream>
#include <fstream>
#include <cstddef>
#include "../require.h"
using namespace std;
/*声明并定义容器map_存储字符及使用数量*/
static map<int,int> map_;
ofstream out("outMap");
/*findCharInLine(string& )从一行字符中统计出字符出现的次数,存入map_容器,在map_中字符自动按照ASCII顺序排列*/
void findCharInLine(const string& line){
int len = line.length();
int Ascii=0; //定义变量Ascii,用来存储从行中读入字符的ASCII码值
int map_size=0; //定义变量map_size,用来存储map_的容量大小,当然也可不用定义该变量
map<int,int>::iterator iter; //声明一个map<int,int>迭代器
for(int i=0; i< len; ++i){ //用for循环从行中逐个读入字符
if((int)line[i]>=32&&(int)line[i]<127){ //过滤读入的字符要在ASCII码值32~126之间
Ascii =(int)(line[i]); //将字符的ASCII码赋给Ascii变量
iter=map_.find(Ascii); //在容器map_找key为Ascii的元素
if(iter!=map_.end()) //如果找到该元素
(iter->second)++; //该元素的value值加1
else //否则,如果没找到key为Ascii的元素
map_.insert(pair<int,int>(Ascii,1)); //将该Ascii值与1做为一个元素插入到容器map_
}
}
}
/*displayASCIIUsage(char T),按用户输入T值(A/D/S)显示map_中ASCII的使用情况*/
void dis_A();
void dis_D();
void dis_S();
void displayASCIIUsage(char T){
switch(toupper(T)){
case 'A':dis_A();
break;
case 'D':dis_D();
break;
case 'S':
dis_S();
break;
default:
cout <<"Don't have the option" <<endl;
break;
}
}
/*freqMap(),通过一个vector容器有序存储容器map的迭代器iterator,
* 实现访问容器vector时,即有序访问了map容器的内容 */
vector<map<int,int>::iterator> v_freq; //定义vector容器用于存储map_容器的迭代器
vector<map<int,int>::iterator>::iterator i_vf; //定义vector容器的一个自身迭代器
void freqMap(){ //freqMap(),函数内容
map<int,int>::iterator iter = map_.begin(); //定义 map容器的一个迭代器iter并指向map头位置
v_freq.push_back(iter); //将iter压入vetor容器v_freq
for( iter= ++map_.begin(); iter != map_.end(); ++iter){ //在map容器map_中从第二个元素开始到最后一个元素,通过迭代器
int i=0; //逐个与vector容器v_freq中的内容比较
for( i =0 ;i < v_freq.size(); ++i){
if((iter->second) <= (v_freq[i])->second){
i_vf = v_freq.begin(); //如果找到在map_中元素的vlaue小于或等于v_freq中的第i个内容指向vlaue
v_freq.insert(i_vf+i,iter); //将该map_元素所在位置的迭代器插入v_freq中第i个位置的前面
break; //退出for,即退出v_freq
}
}
if(i==v_freq.size()){ //如果map_中元素的value值在v_freq中内容指向的value没有,并比v_freq中指向都大
v_freq.push_back(iter); //将该map_元素的迭代器压到v_freq尾部
}
}
}
void disMap_(map<int,int>::iterator i){ // 显示map_中指定的第i个元素
if(i->first != 32 )
out << (char)(i->first)<<": "<<i->second <<'\t'<<endl;
else
out << ("Space")<<": " <<i->second <<'\t'<<endl;
}
void dis_A(){
freqMap();
for(int i=0 ;i < v_freq.size(); ++i){
disMap_(v_freq[i]);
}
}
void dis_D(){
freqMap();
for(int i=v_freq.size()-1 ;i >=0; --i){
disMap_(v_freq[i]);
}
}
void dis_S(){ // 按ASCII码顺序显示
map<int,int>::iterator iter;
for(iter =map_.begin(); iter!= map_.end(); iter++){
disMap_(iter);
}
}
int main(int argc,char* argv[]){
requireArgs(argc,2);
ifstream in(argv[1]);
char type = argv[2][0];
type = toupper(type);
require((type=='A'||type=='D'||type=='S'),"Please,input(A/D/S) to one of options");
string line;
while(getline(in,line)){
findCharInLine(line);
};
displayASCIIUsage(type);
}
#include <map>
#include <vector>
#include <iostream>
#include <fstream>
#include <cstddef>
#include "../require.h"
using namespace std;
/*声明并定义容器map_存储字符及使用数量*/
static map<int,int> map_;
ofstream out("outMap");
/*findCharInLine(string& )从一行字符中统计出字符出现的次数,存入map_容器,在map_中字符自动按照ASCII顺序排列*/
void findCharInLine(const string& line){
int len = line.length();
int Ascii=0; //定义变量Ascii,用来存储从行中读入字符的ASCII码值
int map_size=0; //定义变量map_size,用来存储map_的容量大小,当然也可不用定义该变量
map<int,int>::iterator iter; //声明一个map<int,int>迭代器
for(int i=0; i< len; ++i){ //用for循环从行中逐个读入字符
if((int)line[i]>=32&&(int)line[i]<127){ //过滤读入的字符要在ASCII码值32~126之间
Ascii =(int)(line[i]); //将字符的ASCII码赋给Ascii变量
iter=map_.find(Ascii); //在容器map_找key为Ascii的元素
if(iter!=map_.end()) //如果找到该元素
(iter->second)++; //该元素的value值加1
else //否则,如果没找到key为Ascii的元素
map_.insert(pair<int,int>(Ascii,1)); //将该Ascii值与1做为一个元素插入到容器map_
}
}
}
/*displayASCIIUsage(char T),按用户输入T值(A/D/S)显示map_中ASCII的使用情况*/
void dis_A();
void dis_D();
void dis_S();
void displayASCIIUsage(char T){
switch(toupper(T)){
case 'A':dis_A();
break;
case 'D':dis_D();
break;
case 'S':
dis_S();
break;
default:
cout <<"Don't have the option" <<endl;
break;
}
}
/*freqMap(),通过一个vector容器有序存储容器map的迭代器iterator,
* 实现访问容器vector时,即有序访问了map容器的内容 */
vector<map<int,int>::iterator> v_freq; //定义vector容器用于存储map_容器的迭代器
vector<map<int,int>::iterator>::iterator i_vf; //定义vector容器的一个自身迭代器
void freqMap(){ //freqMap(),函数内容
map<int,int>::iterator iter = map_.begin(); //定义 map容器的一个迭代器iter并指向map头位置
v_freq.push_back(iter); //将iter压入vetor容器v_freq
for( iter= ++map_.begin(); iter != map_.end(); ++iter){ //在map容器map_中从第二个元素开始到最后一个元素,通过迭代器
int i=0; //逐个与vector容器v_freq中的内容比较
for( i =0 ;i < v_freq.size(); ++i){
if((iter->second) <= (v_freq[i])->second){
i_vf = v_freq.begin(); //如果找到在map_中元素的vlaue小于或等于v_freq中的第i个内容指向vlaue
v_freq.insert(i_vf+i,iter); //将该map_元素所在位置的迭代器插入v_freq中第i个位置的前面
break; //退出for,即退出v_freq
}
}
if(i==v_freq.size()){ //如果map_中元素的value值在v_freq中内容指向的value没有,并比v_freq中指向都大
v_freq.push_back(iter); //将该map_元素的迭代器压到v_freq尾部
}
}
}
void disMap_(map<int,int>::iterator i){ // 显示map_中指定的第i个元素
if(i->first != 32 )
out << (char)(i->first)<<": "<<i->second <<'\t'<<endl;
else
out << ("Space")<<": " <<i->second <<'\t'<<endl;
}
void dis_A(){
freqMap();
for(int i=0 ;i < v_freq.size(); ++i){
disMap_(v_freq[i]);
}
}
void dis_D(){
freqMap();
for(int i=v_freq.size()-1 ;i >=0; --i){
disMap_(v_freq[i]);
}
}
void dis_S(){ // 按ASCII码顺序显示
map<int,int>::iterator iter;
for(iter =map_.begin(); iter!= map_.end(); iter++){
disMap_(iter);
}
}
int main(int argc,char* argv[]){
requireArgs(argc,2);
ifstream in(argv[1]);
char type = argv[2][0];
type = toupper(type);
require((type=='A'||type=='D'||type=='S'),"Please,input(A/D/S) to one of options");
string line;
while(getline(in,line)){
findCharInLine(line);
};
displayASCIIUsage(type);
}