[C++]重复单词统计

//textquery.h
#pragma once
#ifndef TEXTQUERY_H_
#define TEXTQUERY_H_
#include <vector>
#include <memory>
#include <map>
#include <set>
#include <string>

#include <iostream>
#include <fstream>
#include <sstream>
using namespace std;
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;
};
#endif // !TEXTQUERY_H_
//textquery.cpp
#include "pch.h"
#include "textquery.h"
#include "queryresult.h"
TextQuery::TextQuery(std::ifstream &is) :file(new std::vector<std::string>) {
    std::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);
        }
    }
}
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);
}
//queryresult.h
#pragma once
#ifndef QUERYRESULT_H_
#define QUERYRESULT_H_
#include "textquery.h"
class QueryResult {
    friend std::ostream& print(std::ostream&, const QueryResult&);
public:
    QueryResult(string s, shared_ptr<set<TextQuery::line_no>> p, shared_ptr<vector<string>> f) :sought(s), lines(p), file(f) {}
private:
    string sought;
    shared_ptr<set< TextQuery::line_no>> lines;
    shared_ptr<vector<string>> file;
};

#endif // !QUERYRESULT_H_

TextQuery类用来读取文本并提取每个单词出现的行并保存该行至容器map中

QueryResult类用来查询单词是否出现并打印结果。

使用shared_ptr来避免TextQuery对象先于QueryResult销毁,导致程序无法正常执行。

posted @ 2019-10-10 16:27  Lightmonster  阅读(836)  评论(0编辑  收藏  举报