C++关联容器综合应用:TextQuery小程序
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了C++关联容器综合应用:TextQuery小程序,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3474字,纯文字阅读大概需要5分钟。
内容图文
本文介绍C++关联容器综合应用:TextQuery小程序(源自C++ Primer)。
关于关联容器的概念及介绍,请参考园子里这篇博文:http://www.cnblogs.com/cy568searchx/archive/2012/10/08/2715306.html
1 #include<iostream> 2 #include<fstream> 3 #include<sstream> 4 #include<string> 5 #include<map> 6 #include<vector> 7 #include<set> 8usingnamespace std; 9//文本查询程序 10class TextQuery 11{ 12public: 13 typedef vector<string>::size_type line_no; 14 15void read_file(ifstream &is) 16 { 17 store_file(is); 18 build_map(); 19 } 20set<line_no> run_query(conststring&) const; 21string text_line(line_no) const; 22private: 23void store_file(ifstream&); 24void build_map(); 25 vector<string> lines_of_text; 26 map<string,set<line_no> > word_map; 27}; 28void TextQuery::store_file(ifstream &is) 29{ 30string textline; 31while(getline(is,textline)) 32 lines_of_text.push_back(textline); 33} 34void TextQuery::build_map() 35{ 36//process each line 37for(line_no line_num=0;line_num!=lines_of_text.size();++line_num) 38 { 39 istringstream line(lines_of_text[line_num]); 40string word; 41while(line>>word) 42//add thie line number to the set 43//subscript will add word to the map if it‘s not already there 44 word_map[word].insert(line_num); 45 } 46} 47set<TextQuery::line_no> TextQuery::run_query(conststring &query_word) const 48{ 49//Note:must use find and not subscript the map directly 50//to avoid adding words to word_map! 51 map<string,set<line_no> >::const_iterator loc=word_map.find(query_word); 52if(loc==word_map.end()) 53returnset<line_no>();//not found, return empty set. 54else 55return loc->second; 56} 57string TextQuery::text_line(line_no line) const 58{ 59if(line<lines_of_text.size()) 60return lines_of_text[line]; 61throw out_of_range("line number out of range"); 62} 63string make_plural(size_t ctr,conststring &word,conststring &ending) 64{ 65return (ctr==1)?word:word+ending; 66} 67void print_results(constset<TextQuery::line_no>& locs,conststring& sought,const TextQuery& file) 68{ 69 typedef set<TextQuery::line_no> line_nums; 70 line_nums::size_type size=locs.size(); 71 cout<<"\n"<<sought<<" occurs " 72 <<size<<"" 73 <<make_plural(size,"time","s")<<endl; 74 line_nums::const_iterator it=locs.begin(); 75for(;it!=locs.end();++it) 76 { 77 cout<<"\t(line " 78 <<(*it)+1<<") " 79 <<file.text_line(*it)<<endl; 80 } 81} 82 ifstream& open_file(ifstream &in,conststring &file) 83{ 84in.close(); 85in.clear(); 86 87in.open(file.c_str()); 88returnin; 89} 90//program takes single argument specifying the file to query 91int main(int argc,char **argv) 92{ 93 ifstream infile; 94if(argc<2||!open_file(infile,argv[1])) 95 { 96 cerr<<"No input file!"<<endl; 97return EXIT_FAILURE; 98 } 99 TextQuery tq; 100 tq.read_file(infile);//build query map 101//iterate with the user:prompt for a word to find and print results 102//loop indefinitely;the loop exit is inside the while103while(true) 104 { 105 cout<<"enter word to look for, or q to quit:"; 106string s; 107 cin>>s; 108if(!cin||s=="q") break; 109set<TextQuery::line_no> locs=tq.run_query(s); 110//print count and all occurrences, if any111 print_results(locs,s,tq); 112 } 113return0; 114 }
运行结果:
原文:http://www.cnblogs.com/ChrisLi/p/3792179.html
内容总结
以上是互联网集市为您收集整理的C++关联容器综合应用:TextQuery小程序全部内容,希望文章能够帮你解决C++关联容器综合应用:TextQuery小程序所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。