简化版文本查询类
来源:互联网 发布:皮卡丘帐篷淘宝 编辑:程序博客网 时间:2024/05/18 01:27
/**/class TextQuery{ public: typedef string::size_type str_size; typedef vector<string>::size_type line_no; void read_file(ifstream &is) { store_file(is); build_map(); } string text_line(line_no line) const { if(line<line_of_text.size()) return line_of_text[line]; throw out_of_range("line number out of range"); } set<line_no> run_query(const string& query_word) const; private: void TextQuery::store_file(ifstream& is) { string textline; while(getline(is, textline)) line_of_text.push_back(textline); } void build_map() { for(line_no line_num=0; line_num!=line_of_text.size(); ++line_num) { istringstream line(line_of_text[line_num]); string word; while(line>>word) word_map[cleanup_str(word)].insert(line_num); } } static string cleanup_str(const string& word) { string ret; for(string::const_iterator it=word.begin(); it!=word.end(); ++it) { if(!ispunct(*it)) ret+=tolower(*it); } return ret; } vector<string> line_of_text; map<string,set<line_no> > word_map;};set<TextQuery::line_no> TextQuery::run_query(const string& query_word) const{string subword(query_word); map<string,set<line_no> >::const_iterator it=word_map.find(cleanup_str(subword)); if(it==word_map.end()) return set<line_no>(); else return it->second;}void print_results(const set<TextQuery::line_no>& result, const string& querytext,const TextQuery &tq){ typedef set<TextQuery::line_no> lines; lines::size_type size=result.size(); cout<<endl<<querytext<<" occurs " <<size<<(size>1?" time ":" times ")<<endl; for(lines::const_iterator it=result.begin(); it!=result.end(); ++it) { stringstream istr;istr<<"\t"<<"line("<<((*it)+1)<<")"; cout<<setw(10)<<left<<istr.str(); cout<<setw(10)<<left<<tq.text_line(*it)<<endl; } }int main(int argc, const char *argv[]){ ifstream infile; string filename(__FILE__); infile.close(); infile.clear(); infile.open(filename.c_str()); TextQuery tq; tq.read_file(infile); string query_word; set<TextQuery::line_no> result; while(cin>>query_word && query_word!="q" ) { result=tq.run_query(query_word); print_results(result,query_word, tq); } system("pause"); return 0;}