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; }