C++primer CH12智能指针

智能指针就是可以自己计算指针所指向的对象是否需要释放,也就是不用自己写deete p.

#pragma once
#ifndef QUERYRESULT
#define QUERYRESYLT

#include <string>
using std::string;

#include <vector>
using std::vector;

#include <memory>
using std::shared_ptr;

#include <sstream>
#include <algorithm>
#include <iostream>
#include <fstream>
#include <map>
#include <set>

class QueryResult;



class TextQuery {
public:
	using lineNo = vector<string>::size_type;
	TextQuery(std::ifstream&);
	QueryResult query(const string&) const;
private:
	shared_ptr<vector<string>> input;
	std::map<string, shared_ptr<std::set<lineNo>>> result;
};
TextQuery::TextQuery(std::ifstream& ifs) :input(new vector<string>) {
	lineNo lineNoV{ 0 };
	for (string line; std::getline(ifs, line); ++lineNoV) {//++lineNov是一个size_t 类型的局部变量
		input->push_back(line);
		std::istringstream line_stream(line);
		for (string text, word; line_stream >> text; word.clear()) {
			 avoid read a word followed by punctuation(such as: word, )
			std::remove_copy_if(text.begin(), text.end(), std::back_inserter(word), ispunct);
			auto& nos = result[word];
			if (!nos) nos.reset(new std::set<lineNo>);
			nos->insert(lineNoV);

		}
	}
}

class QueryResult {
public:
	friend std::ostream& print(std::ostream&, const QueryResult&);
	QueryResult(const string& s, shared_ptr<std::set<TextQuery::lineNo>> set,
		shared_ptr<vector<string>> v) :word(s), nos(set), input(v) {};
private:
	string word;
	shared_ptr<std::set<TextQuery::lineNo>> nos;
	shared_ptr<vector<string>> input;
};


QueryResult TextQuery::query(const string& str) const {
	//use static just allocate once
	static shared_ptr<std::set<lineNo>> nodata(new std::set<lineNo>);
	auto found = result.find(str);
	if (found == result.end()) return QueryResult(str, nodata, input);
	else
		return QueryResult(str, found->second, input);

}


std::ostream& print(std::ostream& out, const QueryResult& qr)
{
	out << qr.word << " occurs " << qr.nos->size() << (qr.nos->size() > 1 ? " times" : " time") << std::endl;
	for (auto i : *qr.nos)
		out << "\t(line " << i + 1 << ") " << qr.input->at(i) << std::endl;
	return out;
}

#endif

#include "QueryResult.h"
#include <iostream>

void runQueries(std::ifstream& infile)
{
    TextQuery tq(infile);
    while (true) {
        std::cout << "enter word to look for, or q to quit: ";
        string s;
        if (!(std::cin >> s) || s == "q") break;
        print(std::cout, tq.query(s)) << std::endl;
    }
}

int main()
{
    std::ifstream file("test.txt");
    runQueries(file);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值