标签:一个 cout make file str push iostream har span
程序:允许用户在一个给定文件中查询单词,查询结果是单词在文件中出现的次数及其所在行的列表。如果一个单词在一行中出现多次,此行只列出一次。
#include <iostream>
#include <fstream>
#include <sstream>
#include <memory>
#include <map>
#include <set>
#include <vector>
#include <string>
using namespace std;
class QueryResult;
//保存输入文件
class TextQuery {
using lineNo = vector<string>::size_type;
public:
TextQuery(ifstream &is);
QueryResult query(const string&) const;
private:
shared_ptr<vector<string>> file;
map<string, shared_ptr<set<lineNo>>> imap;
};
//保存查询结果
class QueryResult {
using lineNo = vector<string>::size_type;
friend ostream& operator<<(ostream&, const QueryResult&);
public:
QueryResult(const string &s, shared_ptr<vector<string>> f, shared_ptr<set<lineNo>> l) :sword(s), file(f), line(l) {}
private:
string sword;
shared_ptr<vector<string>> file;
shared_ptr<set<lineNo>> line;
};
TextQuery::TextQuery(ifstream &is) :file(make_shared<vector<string>>())
{
string line;
while (getline(is, line)) {
file->push_back(line);
istringstream in(line);
auto l = file->size() - 1;
string word;
while (in >> word) {
shared_ptr<set<lineNo>> &r = imap[word];
if (!r)
r.reset(new set<lineNo>);
r->insert(l);
}
}
}
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, it->second);
else
return QueryResult(word, file, nodata);
}
ostream& operator<<(ostream &os, const QueryResult &qr)
{
auto cnt = qr.line->size();
os << qr.sword << " occurs " << cnt << (cnt > 1 ? " times" : " time") << endl;
for (auto l : *qr.line) {
os << "\t(line " << l + 1 << ") " << *(qr.file->begin() + l) << endl;
}
return os;
}
int main()
{
ifstream in("data.txt");
TextQuery tq(in);
cout << "请输入要查询的单词:\n";
string s;
while (cin >> s) {
cout << tq.query(s) << endl;
cout << "请输入要查询的单词:\n";
}
return 0;
}
标签:一个 cout make file str push iostream har span
原文地址:http://www.cnblogs.com/xzxl/p/7853583.html