Skip to content

Instantly share code, notes, and snippets.

@JeOam
Created July 14, 2018 09:40
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save JeOam/66b5d4f0c493f7bd7385429f17dcfc9f to your computer and use it in GitHub Desktop.
Save JeOam/66b5d4f0c493f7bd7385429f17dcfc9f to your computer and use it in GitHub Desktop.
C++ 文本查询程序设计(12.3.1)
@JeOam
Copy link
Author

JeOam commented Jul 14, 2018

void runQueries(ifstream &infile)
{
    TextQuery 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;
    }
}

@JeOam
Copy link
Author

JeOam commented Jul 14, 2018

class QueryResult;
class TextQuery {
public:
    using line_no = std::vector<std::string>::size_type;
    TextQuery(std::ifstream&);
    QueryResult 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;
};

@JeOam
Copy link
Author

JeOam commented Jul 14, 2018

TextQuery::TextQuery(ifsteam &is): file(new vector<string>)
{
    string text;
    while (getline(is, text)) {
        file->push_back(text);
        int n = file->size() - 1;
        istringstream line(text);
        string word;
        while (line >> word) {
            auto &lines = wm[word];
            if (!lines) {
                lines.reset(new set(line_no);
            }
            lines->insert(n);
        }
    }
};

@JeOam
Copy link
Author

JeOam commented Jul 14, 2018

class QueryResult {
friend std::ostream& print(std:ostream&, const QueryResult&);
public:
  QueryResult(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;
}

@JeOam
Copy link
Author

JeOam commented Jul 14, 2018

QueryResult TextQuery::query(const string &sought) const
{
  static shared_ptr<set<line_no>> nodata(new set<line_no>);
  auto loc = wm.find(sought);
  if (loc == wm.end()) 
    return QueryResult(sought, nodata, file)
  else
    return QueryResult(sought, loc->second, file);
}

@JeOam
Copy link
Author

JeOam commented Jul 14, 2018

ostream &print(ostream & os, cosnt QueryResult &qr)
{
  os << qr.sought << " occurs " << qr.lines->size() << " "
     << make_plural(qr.lines->size(), "time", "s") << endl;
  for (auto num: *qr.lines)
    os << "\t(line )" << num + 1 << ") "
       << *(qr.file->begin() + num) << endl;
  return os;
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment