C++文本查询程序 定义类管理数据 用智能指针 C++Primer练习12.30
2018-01-04 23:50
483 查看
// TextQueryBook,QueryResultBook类的定义.h文件 #ifndef TEXTQUERYBOOK_H #define TEXTQUERYBOOK_H #include<memory> #include<vector> #include<string> #include<map> #include<set> #include<fstream> #include<sstream> class QueryResultBook; class TextQueryBook { public: using line_no = std::vector<std::string>::size_type; TextQueryBook(std::ifstream&); QueryResultBook query(const std::string&) const; private: std::shared_ptr<std::vector<std::string>> file; //输入文件 std::map<std::string, std::shared_ptr<std::set<line_no>>> wm;//每个单词到到它所在行号的集合的映射 }; class QueryResultBook { friend std::ostream& print(std::ostream&, const QueryResultBook&); public: using line_no = std::vector<std::string>::size_type; QueryResultBook(std::string s, std::shared_ptr<std::set<line_no>> p, std::shared_ptr<std::vector<std::string>> f): sought(s), lines(p), file(f) { } private: std::string sought; //查询单词 std::shared_ptr<std::set<line_no>> lines; //出现的行号 std::shared_ptr<std::vector<std::string>> file; //输入的文件 }; #endif // TextQueryBook,QueryResultBook类的实现.cpp文件 #include "TextQueryBook.h" using namespace::std; TextQueryBook::TextQueryBook(ifstream& infile):file(new vector<string>) //创建一个file的指针,指向空的vector<string> { string str; while (getline(infile, str)) { file->push_back(str); int num = file->size()-1; //当前行号 istringstream istr(str); string word; while (istr >> word) { auto &line = wm[word]; //line为行号的set的指针,如果word是第一次出现,则先添加word后绑定,否则直接line和指针绑定 if (!line) //如果指向的是空对象,说明此word还没有创建新的set,要创建新的set,为后续插入行号做准备 line.reset(new set<line_no>);//重新分配对象给line line->insert(num); //如果一个单词在一行中出现多次,则只记录一次 } } } QueryResultBook TextQueryBook::query(const string& word) const {//查询单词,把结果传给QueryResult auto ret = wm.find(word); if (ret != wm.end()) return QueryResultBook(word, ret->second, file); else { static shared_ptr<set<line_no>> p(new set<line_no>); return QueryResultBook(word,p,file); } } string make_plural(size_t ctr,const string &word,const string &ending) { return(ctr > 1) ? word + ending : word; } ostream &print(ostream& out, const QueryResultBook& qr) { out << qr.sought << " occurs " << qr.lines->size() << make_plural(qr.lines->size(), "times", "s") << endl; for (auto wq = qr.lines->begin(); wq != qr.lines->end(); ++wq) { out << "(line " << *wq + 1 << ")" << *(qr.file->begin() + *wq) << endl; } return out; } //测试文件.cpp #include<iostream> #include "TextQueryBook.h" using namespace std; void RunQueries(ifstream &infile) { TextQueryBook tq(infile); while (true) { cout << "enter word to look for,or q to quit: "; string s; if (!(cin >> s) || s == "q") break; print(cout, tq.query(s))<< endl; } } int main() { ifstream infile("wordtext.txt"); RunQueries(infile); return 0; }
相关文章推荐
- C++文本查询程序 定义类管理数据 用智能指针 C++Primer练习12.30
- C++文本查询程序 定义类管理数据 用智能指针 C++Primer练习12.30
- C++文本查询程序 定义类管理数据 用智能指针 C++Primer练习12.30
- C++文本查询程序 定义类管理数据 用智能指针 C++Primer练习12.30
- C++文本查询程序 定义类管理数据 用智能指针 C++Primer练习12.30
- C++文本查询程序 定义类管理数据 用智能指针 C++Primer练习12.30
- C++文本查询程序 定义类管理数据 用智能指针 C++Primer练习12.30
- C++文本查询程序 定义类管理数据 用智能指针 C++Primer练习12.30
- C++文本查询程序 定义类管理数据 用智能指针 C++Primer练习12.30
- C++文本查询程序 定义类管理数据 用智能指针 C++Primer练习12.30
- C++文本查询程序 定义类管理数据 用智能指针 C++Primer练习12.30
- C++文本查询程序 定义类管理数据 用智能指针 C++Primer练习12.30
- C++文本查询程序 定义类管理数据 用智能指针 C++Primer练习12.30
- C++文本查询程序 定义类管理数据 用智能指针 C++Primer练习12.30
- C++文本查询程序 定义类管理数据 用智能指针 C++Primer练习12.30
- C++文本查询程序 定义类管理数据 用智能指针 C++Primer练习12.30
- C++文本查询程序 定义类管理数据 用智能指针 C++Primer练习12.30
- C++文本查询程序 定义类管理数据 用智能指针 C++Primer练习12.30
- C++文本查询程序 定义类管理数据 用智能指针 C++Primer练习12.30
- C++文本查询程序 定义类管理数据 用智能指针 C++Primer练习12.30