关于一个inline用法的有关问题,请进来看看
关于一个inline用法的问题,请进来看看
- C/C++ code
#include <iostream> #include <sstream> #include <fstream> #include <string> #include <vector> #include <map> #include <set> using std::cin;using std::cout;using std::endl; using std::string;using std::vector; using std::ostream;using std::fstream;using std::stringstream; using std::set;using std::multimap;using std::pair; using std::runtime_error; class TextQuery{ public: typedef multimap<string,int>::const_iterator multi_con_iter; typedef pair<TextQuery::multi_con_iter,TextQuery::multi_con_iter> multi_word_range; bool Is_file_ok; void Text_file_set(const string& file_path); pair<multi_con_iter,multi_con_iter> RUN_QW(string Query_word); void QueryPrint(); private: pair<multi_con_iter,multi_con_iter> Query_word_range; multimap<string,int> Word_line; set<int> Get_text_line; vector<string> Text_file; int Occurs_time; }; void TextQuery::Text_file_set(const string& file_path){ fstream open_text_file; open_text_file.open(file_path.c_str(),fstream::in); if(!open_text_file) {Is_file_ok=false;} else{ string tempsentence; Text_file.clear(); while(getline(open_text_file,tempsentence)) Text_file.push_back(tempsentence); open_text_file.close(); open_text_file.clear(); int line=1; Word_line.clear(); stringstream get_each_word_line; for(vector<string>::const_iterator iter=Text_file.begin();iter!=Text_file.end();iter++,line++){ get_each_word_line.str(*iter); while(get_each_word_line>>tempsentence){ Word_line.insert(make_pair(tempsentence,line)); }get_each_word_line.clear(); } Is_file_ok=true; } } TextQuery::multi_word_range TextQuery::RUN_QW(string Query_word){ if(!Is_file_ok) throw runtime_error("Could NOT OPEN THE FILE!"); Get_text_line.clear(); Occurs_time=0; Query_word_range=Word_line.equal_range(Query_word); while(Query_word_range.first!=Query_word_range.second){ Get_text_line.insert(Query_word_range.first->second); Occurs_time++; Query_word_range.first++; } return Query_word_range; } void TextQuery::QueryPrint(){ if(!Is_file_ok){ cout <<"ERROR!! Could Not Open File!"<<endl; return; } if(!Occurs_time) cout <<"No search word"<<endl; else{ cout <<"element occurs "<<Occurs_time<<" time :"<<endl; for(set<int>::const_iterator iter=Get_text_line.begin();iter!=Get_text_line.end();iter++){ cout <<*iter<<" "<<Text_file[*iter-1]<<endl; } } } ///////////////////////////////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////////////////////////////// class Query_base{ friend class Query; public: virtual ~Query_base(){} private: virtual TextQuery::multi_word_range eval(const TextQuery&)const=0; virtual ostream& display(ostream& =cout)const=0; }; class Query{ friend Query operator~(const Query&); friend Query operator&(const Query&,const Query&); friend Query operator|(const Query&,const Query&); public: TextQuery::multi_word_range eval(const TextQuery &t)const{return pq->eval(t);} ostream& display(ostream& os)const{return pq->display(os);} //constructor Query(const string &); Query(const Query &origin):pq(origin.pq),use(origin.use){*use++;} //destructor ~Query(){decr_use();} //operator Query& operator=(const Query&); private: void decr_use(){if (--*use==0)delete pq;delete use;} Query(Query_base *q):pq(q),use(new size_t(1)){}; Query_base *pq; size_t *use; }; ostream& operator<<(ostream& os,const Query& Q){return Q.display(os);} class WordQuery:public Query_base{ friend class Query; TextQuery::multi_word_range eval(TextQuery& t)const{return t.RUN_QW(QW);} ostream& display(ostream& os)const{return os<<QW;} //constructor WordQuery(const string& s):QW(s){} private: string QW; }; class NotQuery:public Query_base{ friend Query operator~(const Query&); public: TextQuery::multi_word_range eval(const TextQuery& t)const; ostream& display(ostream& os)const{return os<<"~"<<"\""<<NQ<<"\"";} //constructor NotQuery(Query q):NQ(q){} private: const Query NQ; }; class BinaryQuery:public Query_base{ friend class Query; public: ostream& display(ostream& os)const/*{return os<<" "<<LQ<<" "<<oper<<RQ;}*/; //constructor BinaryQuery(Query L,Query R,string op):LQ(L),RQ(R),oper(op){} private: const Query LQ,RQ; const string oper; }; class AndQuery:public BinaryQuery{ friend Query operator&(const Query& q1,const Query& q2); public: TextQuery::multi_word_range eval(const TextQuery&)const; //constructor AndQuery(Query L,Query R):BinaryQuery(L,R,"&"){} }; class OrQuery:public BinaryQuery{ friend Query operator|(const Query& q1,const Query& q2); public: TextQuery::multi_word_range eval(const TextQuery&)const; //constructor OrQuery(Query L,Query R):BinaryQuery(L,R,"|"){} }; inline Query operator~(const Query& q){return new NotQuery(q);} inline Query operator&(const Query& q1,const Query& q2){return new AndQuery(q1,q2);} inline Query operator|(const Query& q1,const Query& q2){return new OrQuery(q1,q2);}