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

来源:互联网 发布:拼音教学软件下载 编辑:程序博客网 时间:2024/06/06 01:02

请大家重点看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_freqfor( 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个内容指向vlauev_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);}