亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C++ > 正文

【C++ Primer】文本查詢程序再探

2019-11-06 07:12:36
字體:
來源:轉載
供稿:網友

textquery.h

#ifndef _TEXTQUERY_H#define _TEXTQUERY_H#include <iostream>#include <map>#include <set>#include <fstream>#include <sstream>#include <memory>#include <vector>#include <string>#include <algorithm>class QueryResult;	//查詢結果類class TextQuery;	//文本查詢類using line_no = std::vector<std::string>::size_type;//查詢結果類class QueryResult{	friend class TextQuery;	friend std::ostream &Operator<<(std::ostream &os, const QueryResult &q);public:	QueryResult() = default;		QueryResult(std::string q_Word, std::shared_ptr<std::set<line_no>> lines, 				std::shared_ptr<std::vector<std::string>> word_file) :					q_word_(q_word), lines_(lines), word_file_(word_file) {}	std::set<line_no>::iterator begin();		std::set<line_no>::iterator end();	std::shared_ptr<std::vector<std::string>> get_file();PRivate:	std::string q_word_;										//要查詢的單詞	std::shared_ptr<std::set<line_no>> lines_;					//出現行號的集合	std::shared_ptr<std::vector<std::string>> word_file_;		//單詞文件};//文本查詢類class TextQuery{	friend class QueryResult;public:	TextQuery() = default;	TextQuery(std::ifstream &is);	//查詢函數	QueryResult query(const std::string &word) const;private:	std::shared_ptr<std::vector<std::string>> m_file_;	//查詢的文本	std::map<std::string, std::shared_ptr<std::set<line_no>>> m_word_line_;	//每個單詞以及它的行號集合};//Query_base抽象基類,制定一個標準class Query_base{	friend class Query;protected:	virtual ~Query_base() = default;private:	//eval返回與當前TextQuery匹配的QueryResult	virtual QueryResult eval(const TextQuery &) const = 0;	//rep表示查詢的一個string	virtual std::string rep() const = 0;};//接口類,基類包括派生類都可以通過Query來使用,隱藏實現//Query包裝了Query_baseclass Query{	friend Query operator~(const Query &);					//非	friend Query operator&(const Query &, const Query &);	//與	friend Query operator|(const Query &, const Query &);	//或	friend std::ostream &operator<<(std::ostream &os, const Query &query);public:	Query(const std::string &query_word);	QueryResult eval(const TextQuery &t) const	{		return query_->eval(t);	}	std::string rep() const	{		return query_->rep();	}private:	//構造函數定義為private,不希望一般用戶隨便定義Query_base對象。 	//注意:友元類可以訪問protected和private成員。	Query(std::shared_ptr<Query_base> query) : query_(query) {}	//通過智能指針實現動態綁定	std::shared_ptr<Query_base> query_;	//查詢};//派生類class WordQuery : public Query_base{	friend class Query;	WordQuery(const std::string &query_word) : query_word_(query_word) {}	//查詢單詞	QueryResult eval(const TextQuery &t) const	{		return t.query(query_word_);	}	//查詢的一個string	std::string rep() const	{		return query_word_;	}private:	std::string query_word_;	//要查找的單詞	};//無論哪種查詢都是建立在WordQuery的根本上,因此 Query的構造函數用一個WordQuery來初始化  inline Query::Query(const std::string &query_word) : 				query_(new WordQuery(query_word)) {}//非查詢類class NotQuery : public Query_base{	friend Query operator~(const Query &query);	NotQuery(const Query &query) : query_(query) {}		//覆蓋純虛函數	QueryResult eval(const TextQuery &) const override;	std::string rep() const override 	{		return "~(" + query_.rep() + ")";	}private:	Query query_;	//查詢對象};inline Query operator~(const Query &query){	return std::shared_ptr<Query_base>(new NotQuery(query));}//兩個運算符的抽象基類  class BinaryQuery : public Query_base{protected:	BinaryQuery(const Query &left, const Query &right, std::string op) :		left_(left), right_(right), op_(op) {}		std::string rep() const override	{		return "(" + left_.rep() + " " + op_ + right_.rep() + ")";	}	//因為eval函數還沒有定義,所以BinaryQuery還是抽象類	Query left_;			//左操作數	Query right_;			//右操作數	std::string op_;		//操作符};//與操作類class AndQuery : public BinaryQuery{	friend Query operator&(const Query &left, const Query &right);	AndQuery(const Query &left, const Query &right) :		BinaryQuery(left, right, "&") {}	QueryResult eval(const TextQuery &t) const;};inline Query operator&(const Query &left, const Query &right){	return std::shared_ptr<Query_base>(new AndQuery(left, right));}//或操作類class OrQuery : public BinaryQuery{	friend Query operator|(const Query &left, const Query &right);	OrQuery(const Query &left, const Query &right) :		BinaryQuery(left, right, "|") {}	QueryResult eval(const TextQuery &t) const;};inline Query operator|(const Query &left, const Query &right){	return std::shared_ptr<Query_base>(new OrQuery(left, right));}#endif

textquery.cpp

#include "textquery.h"//QueryResultstd::ostream &operator<<(std::ostream &os, const QueryResult &result){	os << "單詞出現了:" << result.lines_->size() << "次/n";	for (line_no i : *result.lines_)	{		os << "  " << "line(" << i + 1 << ") ";		os << (*(result.word_file_))[i] << "/n";	}	return os;}std::set<line_no>::iterator QueryResult::begin(){	return lines_->begin();}std::set<line_no>::iterator QueryResult::end(){	return lines_->end();}std::shared_ptr<std::vector<std::string>> QueryResult::get_file(){	return word_file_;}//TextQuery//構造函數TextQuery::TextQuery(std::ifstream &is) : m_file_(new std::vector<std::string>){	std::string word;	//單詞	std::string line;	//一行文本	static int i = 0;	//行號	while (std::getline(is, line))	{		m_file_->push_back(line);	//存入vactor<string>的末尾		i = m_file_->size() - 1;	//最后一行的行號		std::istringstream ist(line);		while (ist >> word)		{			auto &li = m_word_line_[word];	//單詞word所在的行號集			if (!li)			{				//為空,創建一個set<line_no>				li.reset(new std::set<line_no>);			}			//不為空			li->insert(i);		}	}}//單詞查詢QueryResult TextQuery::query(const std::string &word) const{	static std::shared_ptr<std::set<line_no>> nodata(new std::set<line_no>);	//指向行號集的指針	auto ret = m_word_line_.find(word);	if (ret == m_word_line_.end())	{		return QueryResult(word, nodata, m_file_);	}	else	{		return QueryResult(word, ret->second, m_file_);	}}std::ostream &operator<<(std::ostream &os, const Query &query){	return os << query.rep();}//NotQueryQueryResult NotQuery::eval(const TextQuery &text) const {	auto result = query_.eval(text);	//文本查詢的結果集合	auto ret_lines = std::make_shared<std::set<line_no>>();	//行號集合	auto begin = result.begin();	auto end = result.end();	auto sz = result.get_file()->size();	//文本總行數	for (std::size_t n = 0; n != sz; ++n)	{		if (begin == end || *begin != n)		{			ret_lines->insert(n);		} 		else if (begin != end)		{			++begin;		}	}	return QueryResult(rep(), ret_lines, result.get_file());}//AndQueryQueryResult AndQuery::eval(const TextQuery &text) const{	auto left = left_.eval(text);	auto right = right_.eval(text);	auto ret_lines = std::make_shared<std::set<line_no>>();	//將兩個范圍的交集寫入一個目的迭代器中	//本次調用的目的迭代器向ret_lines添加元素	set_intersection(left.begin(), left.end(),		right.begin(), right.end(),		inserter(*ret_lines, ret_lines->begin()));		return QueryResult(rep(), ret_lines, left.get_file());}//OrQueryQueryResult OrQuery::eval(const TextQuery &text) const{	auto left = left_.eval(text);	auto right = right_.eval(text);	auto ret_lines = std::make_shared<std::set<line_no>>(left.begin(), left.end());	ret_lines->insert(right.begin(), right.end());	return QueryResult(rep(), ret_lines, left.get_file());}main.cpp

#include "textquery.h"int main(int argc, char *argv[]){	std::ifstream is(argv[1]);	TextQuery t1(is);	std::string word;	Query q = Query("fiery") & Query("bird") | Query("wind");	std::cout << q << std::endl;	std::cout << q.eval(t1) << std::endl;		std::cin.get();	return 0;}測試文本 file.txt

Alice Emma has long flowing red hair.Her Daddy says when the wind blowsthrough her hair, it looks almost alive,like a fiery bird in flight.A beautiful fiery bird, he tells her,magical but untamed."Daddy, shush, there is no such thing,"she tells him, at the same time wantinghim to tell her more.Shyly, she asks, "I mean, Daddy, is there?"


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
中文字幕欧美日韩在线| 欧美成人h版在线观看| 55夜色66夜色国产精品视频| 国产91精品青草社区| 欧美日韩国产限制| 欧美孕妇毛茸茸xxxx| 萌白酱国产一区二区| 日韩欧中文字幕| 欧美成人免费小视频| 琪琪第一精品导航| 欧美日韩亚洲精品内裤| 日韩在线视频导航| 国产成人在线视频| 不卡伊人av在线播放| 成人妇女免费播放久久久| 欧美自拍大量在线观看| 亚洲天堂av图片| www国产精品com| 国产欧美va欧美va香蕉在| 国产精品久久久久久久久久久新郎| 国产精品美女久久久久av超清| 亚洲永久在线观看| 亚洲色图欧美制服丝袜另类第一页| 92看片淫黄大片欧美看国产片| 亚洲一区美女视频在线观看免费| 国产精品午夜一区二区欲梦| 日韩成人中文电影| 国产精品久久久久国产a级| 成人免费视频网址| 久久综合88中文色鬼| 欧美电影《睫毛膏》| 欧美激情免费观看| 日本aⅴ大伊香蕉精品视频| 欧美极品xxxx| 日韩亚洲一区二区| 91久久嫩草影院一区二区| 欧美激情视频在线| 日韩精品高清视频| 国产日韩在线视频| 欧美黄色www| 欧美国产精品va在线观看| 亚洲在线免费观看| 日韩电影中文字幕av| 91在线观看免费高清| 国产精品一区二区久久久久| 精品无人区太爽高潮在线播放| 亚洲欧美日本精品| 亚洲激情电影中文字幕| 在线日韩av观看| 国产98色在线| 色综合久久精品亚洲国产| 成人欧美在线观看| 欧美天天综合色影久久精品| 精品无人区乱码1区2区3区在线| 欧美乱人伦中文字幕在线| 久久精品国产亚洲一区二区| 久久久久久久久综合| 欧美黄色www| 精品国产31久久久久久| 日韩精品极品在线观看播放免费视频| 亚洲人成网7777777国产| 中文字幕成人精品久久不卡| 国产精品一区久久久| 日本久久久久久| 欧美日韩成人黄色| 日本久久中文字幕| 国产精品偷伦视频免费观看国产| 国产精品第一视频| 国产做受高潮69| 国产一区av在线| 亚洲国产成人一区| 色综合久久中文字幕综合网小说| 欧美电影免费在线观看| 欧美成年人视频网站欧美| 国产精品成人免费电影| 精品久久久久久久久久国产| 欧美电影在线播放| 国产精品美女www爽爽爽视频| 日韩成人在线观看| 成人激情综合网| 亚洲一区二区三区在线视频| 欧美一级成年大片在线观看| 成人av在线网址| 亚洲高清一区二| 成人激情在线播放| 国产精品久久久久久久久久ktv| 69精品小视频| 亚洲精品在线看| 日韩精品在线免费观看视频| 亚洲人成电影在线| 国产精品高潮呻吟视频| 日韩中文字幕在线看| 国产一区二区三区在线视频| 亚洲欧美日韩中文在线| 亚洲少妇激情视频| 91久久久久久久久| 成人黄色免费网站在线观看| 欧美理论电影在线观看| 国产精品久久久久久久午夜| 日韩a**中文字幕| 狠狠色香婷婷久久亚洲精品| 亚洲一区亚洲二区亚洲三区| 中文综合在线观看| 在线成人激情视频| 2019av中文字幕| 国产91色在线|免| 欧美自拍视频在线| 久久综合九色九九| 亚洲福利在线播放| 欧美重口另类videos人妖| 国产成人一区二区在线| 亚洲成成品网站| 欧美性猛交xxxx乱大交| 欧美电影免费观看高清完整| 欧美成人精品一区| 欧美精品做受xxx性少妇| 成人国产精品一区| 亚洲网站视频福利| 国产精品久久久久久av福利| 久久久中文字幕| 伊人久久大香线蕉av一区二区| 影音先锋日韩有码| 亚洲精品国产成人| 欧美日韩中文字幕综合视频| 日韩精品中文字幕在线播放| 日韩中文字幕在线精品| 91在线观看免费高清完整版在线观看| 国产不卡一区二区在线播放| 欧美日本中文字幕| 亚洲免费人成在线视频观看| 国产丝袜视频一区| 亚洲性日韩精品一区二区| 国产丝袜一区二区三区免费视频| 午夜精品久久久久久久男人的天堂| 欧美日韩国产一区中文午夜| 91中文字幕在线观看| 激情亚洲一区二区三区四区| 丝袜一区二区三区| 伊人成人开心激情综合网| 国产精品视频免费观看www| 日韩国产高清视频在线| 欧美日韩亚洲视频| 8x拔播拔播x8国产精品| 久久中文字幕一区| 亚洲另类欧美自拍| 欧美激情18p| 国产性猛交xxxx免费看久久| 日本久久91av| xvideos国产精品| 日韩天堂在线视频| 欧美日韩在线视频首页| 亚洲黄在线观看| 久久av.com| 91精品国产91久久久久福利| 久久人人97超碰精品888| 成人有码在线播放| 欧美一级在线亚洲天堂| 国产精品久久久久久久久免费| 亚洲第一二三四五区| 青草热久免费精品视频| 成人黄色中文字幕| 欧美理论电影在线观看| 亚洲一区二区在线播放| 欧美www在线|