tuple类型的单词查询例子
17.3 重写前面的TextQuery程序,使用tuple代替QueryResult类。
TextQuery.h
#ifndef TEXTQUERY_H
#define TEXTQUERY_H
#include<iostream>
#include<string>
#include<fstream>
#include<vector>
#include<memory>
#include<map>
#include<set>
#include<new>
#include<tuple>
#include"DebugDelete.h"
using namespace std;
class QueryResult;
class TextQuery
{
public:
using line_no=vector<string>::size_type;
TextQuery(ifstream&);
tuple<string,shared_ptr<set<TextQuery::line_no>>,shared_ptr<vector<string>>> query(const string&) const;
~TextQuery()
{
//DebugDelete()(new vector<string>);
cout<<"destructing...."<<endl;
}
private:
shared_ptr<vector<string>> file;
map<string,shared_ptr<set<line_no>>> wm;
};
#endif // TEXTQUERY_H
TextQuery.cpp
#include"TextQuery.h"
#include<tuple>
#include<sstream>
TextQuery::TextQuery(ifstream& is):file(new vector<string>,DebugDelete())
{
string text;
while(getline(is,text))
{
file->push_back(text);
int n=file->size()-;
string word;
istringstream line(text);
while(line>>word)
{
auto &lines=wm[word];
if(!lines)
lines.reset(new set<line_no>);
lines->insert(n);
}
}
} tuple<string,shared_ptr<set<TextQuery::line_no>>,shared_ptr<vector<string>>>
TextQuery::query(const string& sought) const
{
static shared_ptr<set<line_no>> nodata(new set<line_no>);
auto loc=wm.find(sought);
if(loc!=wm.end())
return make_tuple(sought,loc->second,file);
else
return make_tuple(sought,nodata,file);
}
main.cpp
/*
* This file contains code from "C++ Primer, Fifth Edition", by Stanley B.
* Lippman, Josee Lajoie, and Barbara E. Moo, and is covered under the
* copyright and warranty notices given in that book:
*
* "Copyright (c) 2013 by Objectwrite, Inc., Josee Lajoie, and Barbara E. Moo."
*
*
* "The authors and publisher have taken care in the preparation of this book,
* but make no expressed or implied warranty of any kind and assume no
* responsibility for errors or omissions. No liability is assumed for
* incidental or consequential damages in connection with or arising out of the
* use of the information or programs contained herein."
*
* Permission is granted for this code to be used for educational purposes in
* association with the book, given proper citation if and when posted or
* reproduced.Any commercial use of this code requires the explicit written
* permission of the publisher, Addison-Wesley Professional, a division of
* Pearson Education, Inc. Send your request for permission, stating clearly
* what code you would like to use, and in what specific way, to the following
* address:
*
* Pearson Education, Inc.
* Rights and Permissions Department
* One Lake Street
* Upper Saddle River, NJ 07458
* Fax: (201) 236-3290
*/ #include <string>
using std::string; #include <fstream>
using std::ifstream; #include <iostream>
using std::cin; using std::cout; using std::cerr;
using std::endl; #include <cstdlib> // for EXIT_FAILURE #include "TextQuery.h"
#include<tuple>
ostream &print(ostream &os,const tuple<string,shared_ptr<set<TextQuery::line_no>>,shared_ptr<vector<string>>> &qr)
{
os<<get<>(qr)<<" occurs "<<get<>(qr)->size()<<" times "<<endl;
for(auto num:*get<>(qr))
os<<"\t(line "<<num+<<" ) "
<<(*get<>(qr))[num]<<endl;
return os;
}
void runQueries(ifstream &infile)
{
// infile is an ifstream that is the file we want to query
TextQuery tq(infile); // store the file and build the query map
// iterate with the user: prompt for a word to find and print results
while (true) {
cout << "enter word to look for, or q to quit: ";
string s;
// stop if we hit end-of-file on the input or if a 'q' is entered
if (!(cin >> s) || s == "q") break;
// run the query and print the results
print(cout, tq.query(s)) << endl;
}
} // program takes single argument specifying the file to query
int main(int argc, char **argv)
{
// open the file from which user will query words
ifstream infile;
// open returns void, so we use the comma operator XREF(commaOp)
// to check the state of infile after the open
if (argc < || !(infile.open(argv[]), infile)) {
cerr << "No input file!" << endl;
return EXIT_FAILURE;
}
runQueries(infile);
return ;
}
DebugDelete.h
#include<iostream>
#include<new>
using namespace std; class DebugDelete
{
public:
DebugDelete(ostream &s=cerr):os(s) {}
template <typename T>
void operator()(T *p) const
{
os<<"deleting shared_ptr "<<endl;
delete p;
}
private:
ostream &os;
};
tuple类型的单词查询例子的更多相关文章
- mysql多表查询例子
[理解方式]先分别找出每个表中查询出来的结果,然后再将两个结果合并. create database test charset utf8 collate utf8_bin;use test;creat ...
- Tuple类型
Tuple类型类似的体现了C#中的匿名类型 var person=new { Name="Eric"; Age=18: } 调用: Console.writeline( perso ...
- [System.Net]模拟Web请求编写简易单词查询客户端
demo: 我就不上传了 前言 在实际生活中,网络请求的应用极其常见,比如使用浏览器,程序中我们还要调用webservice.那么浏览器是怎么请求网络资源的呢?不用它可以自己请求不? 答案是可以的. ...
- python学习第五天 List和tuple类型介绍及其List切片
List 和tuple: python提供一种类似C语言数组的类型,但是使用起来确是相当的简洁.那就讲讲这神奇的python中list 和tuple吧. List类型: 1.直接贴代码: L = [' ...
- Scala Tuple类型
Tuple可以作为集合存储不同类型的数据,初始化实例如下: val tuple = (1,3,3.14,"aa") val third = tuple._3 Tuple 下标访问从 ...
- Python实现单词查询&文件查找
最近学C++ Primer,做到第十二章有个习题.要求针对英文文本,对于用户想搜索的单词,打印出该单词在文本中出现的总次数,单词所出现行号及对应的行内容:单词在一行内出现多次,只打印该行一次.C++的 ...
- .net 4.0 中的特性总结(四):Tuple类型
Tuple是具有指定数量和顺序的值的一种数据结构.针对这种数据结构,.Net4.0中提供了一组Tuple类型,具体如下: Tuple Tuple<T> Tuple<T1, T ...
- 编写高质量代码改善C#程序的157个建议——建议26:使用匿名类型存储LINQ查询结果
建议26:使用匿名类型存储LINQ查询结果 从.NET3.0开始,C#开始支持一个新特性:匿名类型.匿名类型有var.赋值运算符和一个非空初始值(或以new开头的初始化项)组成.匿名类型有如下基本特性 ...
- Python之List和Tuple类型(入门3)
转载请标明出处: http://www.cnblogs.com/why168888/p/6407682.html 本文出自:[Edwin博客园] Python之List和Tuple类型 1. Pyth ...
随机推荐
- smarty 比较运算符对照表
smarty 比较运算符对照表 运算符 中文解释 eq 相等 ne.neq 不相等 gt 大于 lt 小于 gte.ge 大于等于 lte.le 小于等于 not 非 mod 求模 is [not] ...
- [原博客] POJ 2975 Nim 统计必胜走法个数
题目链接题意介绍了一遍Nim取石子游戏,可以看上一篇文章详细介绍.问当前状态的必胜走法个数,也就是走到必败状态的方法数. 我们设sg为所有个数的Xor值.首先如果sg==0,它不可能有必胜走法,输出0 ...
- mysql日志的查看与开启
mysql的日志类型: 错误日志: log-error 查询日志: log 慢查询日志: log-slow-queries 更新日志: log-update 二进制日志: log-bin 开启错误日志 ...
- linux使用su切换用户提示 Authentication failure的解决方法& 复制文件时,报cp: omitting directory `XXX'
linux使用su切换用户提示 Authentication failure的解决方法:这个问题产生的原因是由于ubtun系统默认是没有激活root用户的,需要我们手工进行操作,在命令行界面下,或者在 ...
- 任正非:华为三十年大限快到了 想不死就得新生(建立战略预备队)cool
华为心声社区官方微信今日发布了任正非8月15日在华为公司内部做的关于战略预备队建设汇报的讲话.讲话内容中提到,华为公司需要组织.结构.人才等所有一切都变化,通过变化使新的东西成长起来. 任正非表示 ...
- Android推送通知指南
Android推送通知指南 在开发Android和iPhone应用程序时,我们往往需要从服务器不定的向手机客户端即时推送各种通知消息,iPhone上已经有了比较简单的和完美的推送通知解决方案,可是 ...
- statspack系列2
Analysing Statspack 2 命中率陷阱 原文:http://jonathanlewis.wordpress.com/2006/12/27/analysing-statspa ...
- 使用Eclipse创建模板并格式化代码
eclipse设置方式: window-preferences-->java-code Style-formatter 在编写完代码后使用代码格式化程序对代码进行格式化,有利于版本冲突时进行对比 ...
- 【http】client
server.js var qs = require('querystring') require('http').createServer(function(req, res) { var body ...
- 老的acm & oj学习站点
1.网易小鱼博客 http://gisyhy.blog.163.com/blog/#m=0&t=1&c=fks_087069086082087064085081082095085084 ...