1. 头文件:TextQuery.h代码如下:
#ifndef TEXTQUERY_H
#define TEXTQUERY_H
#include
#include
#include
#include
#include
#include
#include
using namespace std;
class TextQuery{
public:
//类型别名
typedef string::size_type str_size;
typedef vector::size_type line_no;
//接口:
//read_file建立建立给定文件的内部数据结构
void read_file(ifstream &is){
store_file(is); build_map();
}
//run_query查询给定单词并返回该单词所在行的行号集合
vector run_query(const string&) const;
//text_line返回输入文件中指定行号对应的行
string text_line(line_no) const;
private:
//read_file使用的辅助函数
void store_file(ifstream&); //存储输入文件
void build_map(); //将每个单词与一个行号集合相关联
//保存输入文件
vector lines_of_text;
//将单词与出现该单词的行号集合相关联
map< string, vector > word_map;
//去掉标点并把字母变成小写
static std::string cleanup_str(const std::string&);
};
#endif
2. TextQuery类的实现文件如下:
#include "TextQuery.h"
#include
string TextQuery::text_line(line_no line) const
{
if(line < lines_of_text.size())
return lines_of_text[line];
throw out_of_range("line number out of range");
}
//读输入文件,将每行存储为lines_of_text的一个元素
void TextQuery::store_file(ifstream &is)
{
string textline;
while(getline(is,textline))
lines_of_text.push_back(textline);
}
//在输入vector中找以空白为间隔的单词