12.26
allocator<char> charAllocator; char * a = charAllocator.allocate(tmp.size());
仅仅将内存申请的方法改为如上即可
12.27
class TextQuery { public: TextQuery() = default; TextQuery(ifstream& ); private: vector<string > vec; map<string, set<int>> wordMap; }; TextQuery::TextQuery(ifstream& ifs){ string lineStr, word; int lineCount = 0; while (getline(ifs, lineStr)) { vec.push_back(lineStr); istringstream ist(lineStr); while (ist >> word && ist.eof()) { wordMap[word].insert(lineCount); } lineCount++; } }12.28
int main(int argc, char *argv[]) { ifstream ifs(argv[1]); vector<string > vec; map<string, set<int>> wordMap; string lineStr, word; int lineCount = 0; while (getline(ifs, lineStr)) { vec.push_back(lineStr); istringstream ist(lineStr); while (ist >> word && !ist.eof()) { wordMap[word].insert(lineCount); } lineCount++; } string key = argv[2]; set<int > lineSet = wordMap[key]; if(lineSet.size()){ for(set<int >::iterator it = lineSet.begin(); it != lineSet.end(); it++){ cout << "(line: " << *it << " ) " << vec.at(*it) << endl; } }else{ cout << "not have any key word in file" << endl; } for (;;); return 0; }
12.29
倾向使用while版本,先判断再执行
12.30
class QueryResult; using line_no = vector<string >::size_type; class TextQuery { public: TextQuery(ifstream&); QueryResult query(const string &)const; private: shared_ptr<vector<string >> file; map<string, shared_ptr<set<line_no>>> wm; }; TextQuery::TextQuery(ifstream & ifs):file(new vector<string>()){ string lineStr, word; while (getline(ifs, lineStr)) { file->push_back(lineStr); int lineCount = file->size(); istringstream ist(lineStr); while (ist >> word) { shared_ptr<set<line_no>>& line = wm[word]; if(!line){ line.reset(new set<line_no>); } line->insert(lineCount); } } } class QueryResult { friend ostream& print(ostream&, const QueryResult& ); public: QueryResult(string s, shared_ptr<set<line_no>> ss, shared_ptr<vector<string>> sp):s(s),ss(ss),sp(sp){}; private: string s; shared_ptr<set<line_no>> ss; shared_ptr<vector<string>> sp; }; QueryResult TextQuery::query(const string & word)const{ static shared_ptr<set<line_no>> noData(new set<line_no>); auto result = wm.find(word); if(result == wm.end()){ return QueryResult(word, noData, file); }else{ return QueryResult(word, wm.find(word)->second, file); } } ostream& print(ostream& os, const QueryResult & ptr){ cout << "you find " << ptr.ss->size() << " in file" << endl; //for (set<line_no>::iterator it = *ptr.ss->begin(); it != *ptr.ss->end(); it++) { // //} for(auto it : *ptr.ss){ cout << "(line: " << it << " ) " << ptr.sp->at(it) << endl; } return os; } int main(int argc, char *argv[]) { ifstream ifs(argv[1]); TextQuery tq(ifs); print(cout,tq.query("happy")); for (;;); return 0; }
12.31
set好,vector每次插入都要遍历容器是否已经存在当前元素
12.32