// 12_27.cpp : 定义控制台应用程序的入口点。
// #include "stdafx.h"
#include<iostream>
#include<memory>
#include<string>
#include<vector>
#include<fstream>
#include<sstream>
#include<map>
#include<set>
using namespace std; //提前声明类QueryResult,在书中说必须提前声明,然而vs2015中
//仅声明友元类亦可
class QueryResult; class TextQuery
{
//友元类的声明
friend class QueryResult;
public:
//构造函数
TextQuery(ifstream &is);
//返回查询的结果
QueryResult query(string s); private:
//用智能指针来保存数据,实现共享
shared_ptr<vector<string>> vecPtr;
shared_ptr<map<string, set<unsigned>>> mapPtr;
}; //TextQuery的构造函数
TextQuery::TextQuery(ifstream &is)
{
//用来暂存每一行的字符串
string word;
//记录行数
unsigned lineNum = ;
//对两个智能指针进行值初始化
vecPtr = shared_ptr<vector<string>>(new vector<string>());
mapPtr = shared_ptr<map<string, set<unsigned>>>(new map<string, set<unsigned>>());
while (getline(is, word))
{
//将每一行保存在类中
vecPtr->push_back(word);
istringstream iss(word);
string str;
while (iss >> str)
{
//将单词所在的行数记录下来
(*mapPtr)[str].insert(lineNum);
}
++lineNum;
}
} class QueryResult
{
public:
//QueryResult的构造函数,vecPtr实现共享
QueryResult(TextQuery &tq, string &s) :vecPtr(tq.vecPtr)
{
//mapPtr指针的值初始化
mapPtr = shared_ptr<map<string, set<unsigned>>>(new map<string, set<unsigned>>());
//将要查询的单词的结果保存下来
mapPtr->insert(pair<string, set<unsigned>>(s, (*tq.mapPtr)[s]));
}
//有缘函数,实现输出
friend ostream& print(ostream&,const QueryResult &qr);
private:
shared_ptr<vector<string>> vecPtr;
shared_ptr<map<string, set<unsigned>>> mapPtr;
}; //QueryResult的友元函数,实现输出
ostream& print(ostream &os,const QueryResult &qr)
{
//输出这个单词出现了多少次
os << (*qr.mapPtr).cbegin()->first << " occurs " << (*qr.mapPtr).cbegin()->second.size() <<
((*qr.mapPtr).cbegin()->second.size() > ? "times" : "time") << endl;
//输出单词所在的行数,和这一行的字符串
for (auto &e : qr.mapPtr->cbegin()->second)
os << "(line " << e << " ) " << (*qr.vecPtr)[e] << endl;
return os;
} //实现查询的函数
QueryResult TextQuery::query(string s)
{
return QueryResult(*this, s);
} void runQueries(ifstream &infile)
{
TextQuery tq(infile);
while (true)
{
cout << "enter word to look for,or q to quit: ";
string s;
if (!(cin >> s) || s == "q")break;
print(cout, tq.query(s)) << endl;
}
} int main()
{
ifstream ifs("D:\\file\\12_27.txt");
if (!ifs)
{
cerr << "open file failed!" << endl;
exit(-);
}
runQueries(ifs);
return ;
}

C++primer 练习12.27的更多相关文章

  1. 12.27 cf div3 解题报告

    12.27 cf div3 解题报告 wxy.wxy,带上分拉,全场做了个无脑小白 比赛场地 A: T1,跟着模拟就好了 B: sort一遍之后 去除的数一定是a[1]或者a[n] 比较去除谁小就输出 ...

  2. 武汉Uber优步司机奖励政策(12月21日-12.27日)

    滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...

  3. 2014 12 27 bestcoder 第一题

    水的不行不行的一道题 也是自己做的第一道题  纪念下 1 #include<stdio.h> 2 #include<string.h> 3 #include<math.h ...

  4. 厦门Uber优步司机奖励政策(12月21日-12.27日)

    滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...

  5. C++primer 练习12.6

    编写函数,返回一个动态分配的int的vector.将此vector传递给另一个函数,这个函数读取标准输入,将读入的值 保存在vector元素中.再将vector传递给另一个函数,打印读入的值.记得在恰 ...

  6. (原)Eclipse Tomcat配置(2014.12.27——By小赞)

    Eclipse中配置自己已经安装的Tomcat 首先为Eclipse安装Tomcat插件: 进入Tomcat插件下载页:http://www.eclipsetotale.com/tomcatPlugi ...

  7. Eclipse SVN插件安装与使用(2014.12.27——by小赞)

    安装参考:http://www.cnblogs.com/xdp-gacl/p/3497016.html 用法参考:http://blog.sina.com.cn/s/blog_8a3d83320100 ...

  8. C++ primer 练习 12.7

    重做上一题,这次使用shared_ptr 而不是内置指针.上一题题目为:(编写函数,返回一个动态分配的int的vector.将此vector传递给另一个函数,这个函数读取标准输入,将读入的值保存在ve ...

  9. ERROR: unable to bind listening socket for address '127.0.0.1:9000': Address already in use (98) [30-Jan-2018 16:12:27] ERROR: FPM initialization failed解决方法

    1.php启动之后发现访问nginx出现502错误,检查nginx.conf发现指定的php socket不存在 2.解决方法nginx修改陈这样,直接把绿色部门的socket写成本地地址+端口就可以 ...

随机推荐

  1. 转:java日志组件介绍(common-logging,log4j,slf4j,logback )

    原网址:http://www.blogjava.net/daiyongzhi/archive/2014/04/13/412364.html common-logging common-logging是 ...

  2. R(六): RODBC 访问SqlServer

    在我的实际工作中,数据来源一方面是关系型数据库MS SqlServer, 别一方面是HBase.本节主要介绍通过RODBC访问MS SqlServer 安装配置,参见资料(https://msdn.m ...

  3. C# WinForm开发系列 - ComboBox

    5.一个带CheckBox,分组,颜色标记等功能的下拉框  PowerComboBoxCSharp.rar 包含自动完成下拉框,字体下拉框,电脑盘符,多列下拉框,带CheckBox,树型下拉框等.代码 ...

  4. 【Hadoop测试程序】编写MapReduce测试Hadoop环境

    我们使用之前搭建好的Hadoop环境,可参见: <[Hadoop环境搭建]Centos6.8搭建hadoop伪分布模式>http://www.cnblogs.com/ssslinppp/p ...

  5. Ubuntu下面配置问题

    下开启root登陆 sudo passwd root 输入两次新密码 就能在虚拟终端下用 root登陆了,或者 su到root用户了. ctrl + alt +t 弹出终端 ctrl+ alt+ f7 ...

  6. 黄聪:C#操作xml SelectNodes,SelectSingleNode通过 xPath 定位class包含Contains的DIV

    一. SelectNodes,SelectSingleNode总是返回NULL 下面以一个简单的xml为例: <?xml version="1.0"?> <mes ...

  7. [Java Web – Maven – 1A]maven 3.3.3 for windows 配置(转)

    1.环境 系统环境:windows 2008 R2 JDK VERSION: 1.7.0_10 2.下载地址 MAVEN 下载地址:http://maven.apache.org/download.c ...

  8. Form_Form标准控件Folder开发解析(案列)

    2014-01-09 Created By BaoXinjian 1. 打开APPSTAND.fmb, 并加载程序库APPFLDR.pll. 2. 基于APPSTAND.fmb生成Folder开发所需 ...

  9. 编译器错误消息: CS0234: 命名空间“Purple”中不存在类型或命名空间名称“Model”(是否缺少程序集引用?)

    编译错误 “/storeimg”应用程序中的服务器错误. 编译错误 说明: 在编译向该请求提供服务所需资源的过程中出现错误.请检查下列特定错误详细信息并适当地修改源代码. 编译器错误消息: CS023 ...

  10. 基于HTML5的多张图片上传

    图片上传之前也有写过demo,不过是单张上传的,最近有个业务需求是需要多张上传的,于是乎从新改写了一下 HTML结构: 1 2 3 4 <div class="container&qu ...