zoukankan      html  css  js  c++  java
  • 文本查询程序——标准库学习小结

    程序:允许用户在一个给定文件中查询单词,查询结果是单词在文件中出现的次数及其所在行的列表。如果一个单词在一行中出现多次,此行只列出一次。

    头文件:

    #include <iostream>
    #include <fstream>
    #include <sstream>
    #include <vector>
    #include <string>
    #include <map>
    #include <set>
    #include <memory>
    
    using namespace std;
    using lineNo = vector<string>::size_type;
    
    class QueryResult;
    class TextQuery {
    public:
    	TextQuery(ifstream&);
    	QueryResult query(const string&) const;
    private:
    	shared_ptr<vector<string>> file;
    	map<string, shared_ptr<set<lineNo>>> imap; 
    };
    
    class QueryResult {
    	friend ostream& operator<<(ostream&, const QueryResult&);
    public:
    	QueryResult(const string &s, shared_ptr<vector<string>> f, shared_ptr<set<lineNo>> l)
    		:qrword(s), qrfile(f), qrline(l) {}
    private:
    	string qrword;
    	shared_ptr<vector<string>> qrfile;
    	shared_ptr<set<lineNo>> qrline;
    };
    
    TextQuery::TextQuery(ifstream &in) :file(new vector<string>)
    {
    	string line;
    	while (getline(in, line)) {
    		file->push_back(line);
    		int rowNo = file->size() - 1;
    		istringstream is(line);
    		string word;
    		while (is >> word) {
    			shared_ptr<set<lineNo>> &r = imap[word];
    			if (!r)
    				r.reset(new set<lineNo>);
    			r->insert(rowNo);
    		}
    	}
    }
    
    QueryResult TextQuery::query(const string &word) const
    {
    	static shared_ptr<set<lineNo>> nodata(new set<lineNo>);
    	auto it = imap.find(word);
    	if (it == imap.end())
    		return QueryResult(word, file, nodata);
    	else
    		return QueryResult(word, file, it->second);
    }
    
    ostream& operator<<(ostream &os, const QueryResult &qr)
    {
    	int cnt = qr.qrline->size();
    	os << qr.qrword << " occurs " << cnt << (cnt > 1 ? " times" : " time") << endl;
    	for (auto &line : *qr.qrline)
    		os << "	(line " << line << ") " << *(qr.qrfile->begin() + line) << endl;
    	return os;
    }
    

    源文件:

    #include "TextQuery.h"
    
    int main()
    {
    	string fileName; 
    	cin >> fileName;
    	ifstream in;
    	in.open(fileName);
    	TextQuery tq(in);
    	cout << "请输入要查询的单词:
    ";
    	string word;
    	while (cin >> word) {
    		cout << tq.query(word) << endl;
    		cout << "请输入要查询的单词:
    ";
    	}
    	in.close();
    }
  • 相关阅读:
    论文笔记4
    论文笔记3
    论文笔记2
    论文笔记1
    论文笔记
    AFG与AWG的比较
    Linux下“有线线缆被拔出”问题的解决
    python生成excel格式座位表
    PythonTip--一马当先--bfs
    python pygame--倒计时
  • 原文地址:https://www.cnblogs.com/xzxl/p/7853583.html
Copyright © 2011-2022 走看看