第五次上机作业KeywordsCounting

来源:互联网 发布:用友软件云南总代理 编辑:程序博客网 时间:2024/06/04 23:23
Define a function that,  given an istream& and a const vector<string>&,  produces a map<string,vector<int>>  holding each string (keyword) and the numbers of the line on which the string appears. The line number of the first line is 1. 
Print in the order of ascending keyword.

Run the program on a text file with at least 10000 lines looking for no fewer than 10 keywords.

这一次的上机作业可以说是把STL的功能对于初学者的全面提升的实际操练。

从vector到string到map到他们的互相组合,都在这一道题里有集中体现。

作业的大致意思是说从一个文件中读入一系列关键字的文本,然后查找一个文档,并把每个在文档出现的关键字的行数都记录下来,最后将一个一个关键字和对应的行数输出。

具体的实现过程是:
用一个vector<string>存储所有的关键词

用一个map<string,vector<int>>存储结果,key为相应关键字,vector<int>存储出现行数。

此外,从一个句子中读入单词的方法是使用istringstreanm,这个stream的派生类可以一次读入一个单词。

剩下的注释看代码吧

#include <iostream>#include <stack>#include <cstdlib>#include <ctime>#include <sstream>#include <vector>#include <fstream>#include <algorithm>#include <map>using namespace std;map<string,vector<int> >result;map<string,vector<int> > solve(istream& fin2,const vector<string>&v){    vector<int> times;//出现行数的vector    vector<string>::iterator ii;    vector<string> vv=v;    for(ii=vv.begin(); ii!=vv.end(); ii++)        result.insert(pair<string,vector<int>>(*ii,times));//把对应的string和出现行数的vector存入map(初始times为空)    int nlines=1;    string s;    while(fin2>>s)    {        string word;//读入一行        istringstream F(s);        while(F>>word)//每次读入一个单词        {            vector<string>::iterator jj;            if((jj=find(vv.begin(),vv.end(),word))!=vv.end())//如果这个单词在关键词的列表中                result[word].push_back(nlines);//把对应的行数存入这个关键词的vector中        }        nlines++;//每次处理完一行,行数加1    }    return result;}int main(int argc,char*argv[]){    ifstream fin;//关键字文本读入    fin.open(argv[1]);    ifstream fin2;    fin2.open(argv[2]);    ofstream fout;    fout.open(argv[3]);    vector<string> keyword;//存取关键字的数组    string word;    while(fin>>word)        keyword.push_back(word);//把所有的关键词存入vector    result=solve(fin2,keyword);    map<string,vector<int> >::iterator ii;    for(ii=result.begin(); ii!=result.end(); ii++)    {        fout<<ii->first<<":{ ";        vector<int>::iterator jj;        for(jj=result[ii->first].begin(); jj!=result[ii->first].end(); jj++)//按要求输出            fout<<*jj<<',';        fout<<" }"<<endl;    }//按格式要求输出    fout.close();    fin.close();    fin2.close();    return 0;}