multimap应用

来源:互联网 发布:mac spark 环境搭建 编辑:程序博客网 时间:2024/06/03 20:12
**从“map测试输入文档.txt”读入 key-value 数值,对其进行统计,算出 total(总数),count(个数),min(最小值),max(最大值),并写入文件// MapApplication.cpp : 定义控制台应用程序的入口点。//VS 2005#include "stdafx.h"#include <cassert>#include <iostream>#include <typeinfo>#include <map>using namespace std;/*因为 string 没有提供 <  操作,这里对 less 类模板进行特化*/template<>struct less<string> : public binary_function<string,string,bool>{bool operator()(const string& _Left, const string& _Right) const{string::size_type i = 0;while(i < _Left.length() && i < _Right.length()){if(_Left.at(i) != _Right.at(i)){return _Left.at(i) > _Right.at(i) ? true : false;}i++;}if(i < _Left.length())return true;if(i < _Right.length())return false;return false;}};int _tmain(int argc, _TCHAR* argv[]){FILE* pFile = NULL;fopen_s(&pFile,"map测试输入文档.txt","r");assert(pFile != NULL);char buf[BUFSIZ + 1]={0};/*把文档内容读入 strRead*///fread 函数不会给 buf 自动填充'\0'size_t readSize = fread(buf,sizeof(char),BUFSIZ,pFile);buf[readSize] = '\0';string strRead;while(readSize){strRead += buf;readSize = fread(buf,sizeof(char),BUFSIZ,pFile);buf[readSize] = '\0';}fclose(pFile);pFile = NULL;/*开始处理 strRead*/string::size_type st;string strName,strNumber;int nNumber;char szName[BUFSIZ + 1];multimap<string,int> mm;while(!strRead.empty()){/*strRead的形式是 "字母+数字+字母+数字..."这里需要把 字母和数字分开可以考虑 strtod(); strspn(); strpbrk()函数是否可用*///找出字母st = strRead.find_first_of("0123456789");if(st <= BUFSIZ){strRead.copy(szName,st);szName[st] = '\0';strName = szName;}strRead.erase(0,st);//找出数字string::size_type i =0;for(i = 0; i < BUFSIZ; i++){if(i >= strRead.length() || !isdigit(strRead.at(i)))break;}i++;if(i <= BUFSIZ){strRead.copy(szName,i);szName[i] = '\0';strNumber = szName;}strRead.erase(0,i);nNumber = atoi(strNumber.c_str());//存入multimapmm.insert(make_pair(strName,nNumber)); }//写文件fopen_s(&pFile,"map测试输出文档.txt","w+");assert(pFile != NULL);size_t sWrite = fwrite("name \t total \t count \t min \t max \n",sizeof(char),strlen("name \t total \t count \t min \t max \n"),pFile);typedef multimap<string,int>::iterator multimapItor;typedef multimap<string,int>::size_type sizeType;multimapItor Itor;pair<multimapItor,multimapItor> p;Itor = mm.begin();int total,min = 0,max = 0;sizeType count;while(Itor != mm.end()){total = 0;min = 0;max = 0;p = mm.equal_range(Itor->first);count = mm.count(Itor->first);multimapItor mI;for(mI = p.first; mI != p.second; mI++){if(min == 0 || max == 0){min = mI->second;max = mI->second;}total += mI->second;//找出最大最小值if(mI->second > max){max = mI->second;}if(mI->second < min){min = mI->second;}}char szWrite[BUFSIZ] = {0};int len = sprintf(szWrite,"% 10s% 5d% 5d% 5d% 5d\n",Itor->first.c_str(),total,count,min,max);szWrite[len] = '\0';fwrite(szWrite,sizeof(char),len,pFile);if(p.second == mm.end())break; Itor = mm.find(p.second->first);}fclose(pFile);system("pause");return 0;}


//map测试输入文档.txt

apple 100
pear 103
banana 200
Peach 150
apple 23
pear 54
banana 75
Peach 29
Peach 43
apple 6
pear 21
Peach 150
apple 64
pear 976
banana 2
Peach 124
Peach 543
apple 100
pear 103
banana 200
Peach 150
apple 23
pear 54
banana 75
Peach 29
Peach 43
apple 6
pear 21
Peach 150
apple 64
pear 976
banana 2
Peach 124
Peach 543
apple 100
pear 103
banana 200
Peach 150
apple 23
pear 54
banana 75
Peach 29
Peach 43
apple 6
pear 21
Peach 150
apple 64
pear 976
banana 222
Peach 401
Peacha 402


//map测试输出文档.txt

name total count min max 
    pear 3462   12   21  976
   banana 1051    9    2  222
   apple  579   12    6  100
   Peacha  402    1  402  402
   Peach 2851   17   29  543

0 0
原创粉丝点击