c++ primer习题10.6 文本查询程序

#ifndef TEXTQUERY_H
#define TEXTQUERY_H

#include<vector>
#include<string>
#include<set>
#include<map>
#include<sstream>
#include<fstream>
using namespace std;

class text_query{
public:
	typedef vector<string>::size_type line_no;
	void read_file(ifstream &is)
	{store_file(is);build_map();}

	set<line_no> run_query(const string &) const;

	string text_line(line_no) const;

private:
	void store_file(ifstream &);
	void build_map();

	vector<string> line_of_text;
	map<string,set<line_no> > word_map;
};

void text_query::store_file(ifstream & infile)
{
	string line;
	while(getline(infile,line))
		line_of_text.push_back(line);
}

void text_query::build_map()
{
	for(line_no line_num=0;line_num<line_of_text.size();++line_num){
		istringstream s_in(line_of_text[line_num]);
		string word;
		while(s_in>>word)
			word_map[word].insert(line_num);
	}
}

set<text_query::line_no> text_query::run_query(const std::string & str) const
{
	map<string,set<line_no> >::const_iterator it=word_map.find(str);
	if(it!=word_map.end()){
		return it->second;
	}else
		return set<line_no>();
}


string text_query::text_line(text_query::line_no l) const
{
	if(l<line_of_text.size())
		return line_of_text[l];
	throw out_of_range("line number out of range!");
}



#endif TEXTQUERY_H




#include<iostream>
#include<map>
#include<set>
#include<string>
#include<vector>
#include<ctime>
#include "text_query.h"
using namespace std;

void print_results(const set<text_query::line_no> & locs,const string & sought,const text_query &file)
{
	set<text_query::line_no>::size_type st=locs.size();
	cout<<"element "<<sought<<" occurs "<<st<<" times"<<endl;
	for(set<text_query::line_no>::const_iterator ite=locs.begin();ite!=locs.end();++ite)
		cout<<"\t(line "<<*ite+1<<")  "<<file.text_line(*ite)<<endl;

}



int main(int argc,char **argv)
{
	ifstream infile;
	infile.open(argv[1]);
	if(argc<2||!infile){
		cerr<<"NO input file!"<<endl;
		return EXIT_FAILURE;
	}
	text_query tq;
	tq.read_file(infile);
	while(true){
		cout<<"enter word to look for ,or q to quit: ";
		string s;
		cin>>s;
		if(!cin||s=="q") break;

		set<text_query::line_no> locs=tq.run_query(s);

		print_results(locs,s,tq);
	}

	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值