通过STL vector容器实现对map容器按值排序,不用sort函数

请大家重点看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);
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值