简化版文本查询类

来源:互联网 发布:皮卡丘帐篷淘宝 编辑:程序博客网 时间: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;}


原创粉丝点击