C/C++:文本查询(单词查询)
如题:
C/C++:
Textqurey.h(方便看都在.h里实现了):
//
// Created by 徐爱东 on 17/7/10.
// #ifndef TEXTQUERY_TEXTQUERY_H
#define TEXTQUERY_TEXTQUERY_H #include <iostream>
#include <memory>
#include <vector>
#include <map>
#include <set>
#include <string>
#include <sstream>
#include <fstream> class Textquery
{
private:
using vsizetype=std::vector<std::string>::size_type;
std::shared_ptr<std::vector<std::string> > File;
std::map<std::string, std::shared_ptr<std::set<vsizetype> > > wm; public:
class QueryResult
{
friend class Textquery; private:
std::string Queryword;
std::shared_ptr<std::vector<std::string> > file_;
std::shared_ptr<std::set<vsizetype> > lines_;
public:
QueryResult(std::string Queryword, std::shared_ptr<std::vector<std::string> > file,
std::shared_ptr<std::set<vsizetype> > lines)
: Queryword(Queryword),
file_(file),
lines_(lines)
{ }
}; Textquery(std::fstream &infile)
: File(new std::vector<std::string>)
{
//文本存入vector并计算单词行数入set
std::string Textline;
std::stringstream stream;
while (std::getline(infile, Textline))
{
stream.clear(); //标志位清理
File->push_back(Textline);
stream << Textline;
vsizetype linenumber = File->size() - ; //行号; while (stream >> Textline) //单词根据空格分隔
{
auto &lines = wm[Textline]; //map[]方式没有则创建,有则返回value_type;
if (!lines) //指针为空,则创建
lines.reset(new std::set<vsizetype>);
lines->insert(linenumber);
}
}
} QueryResult query(const std::string &str)
{
auto loca=wm.find(str); if ( loca!= wm.end())
{
return QueryResult(str, File, wm[str]);
} else
{
std::shared_ptr<std::set<vsizetype>> shared_null(new std::set<vsizetype >); //没找到则返回空指针,防止崩溃
return QueryResult(str, File, shared_null);
}
} std::ostream &display(std::ostream &out, QueryResult result)
{
if (!result.lines_)
{
return out << result.Queryword << " appear 0 time\n"; } else
{
out << result.Queryword << " appear " << result.lines_->size()
<< (result.lines_->size() > ? " times" : " time") << "\n"; for (auto &iter:*result.lines_)
{
out << "\t\t\t\t\t(line" << iter + << "): " << *(result.file_->begin() + iter) << std::endl;
} //不能- -for_each, lamda语法报错?
// std::for_each(result.lines_->begin(), result.lines_->end(), [&](vsizetype &linenumber)
// {
// out<<"\t(line"<<linenumber+1<<"): "<<*(result.file_->begin()+linenumber)<<std::endl;
// }); return out;
}
}
}; #endif //TEXTQUERY_TEXTQUERY_H
main.cpp:
#include <iostream>
#include "Textquery.h" int main()
{
std::fstream file("./Tex.txt", std::ios::in);
std::stringstream stream; Textquery query(file);
std::string word;
do
{
std::cout << "Please input search word or q to quit: ";
std::cin >> word; if (word == "q")break; query.query(word);
query.display(std::cout, query.query(word)); } while ();
std::cout<<"end"<<std::endl;
return ;
}
运行结果:

C/C++:文本查询(单词查询)的更多相关文章
- Python实现单词查询&文件查找
最近学C++ Primer,做到第十二章有个习题.要求针对英文文本,对于用户想搜索的单词,打印出该单词在文本中出现的总次数,单词所出现行号及对应的行内容:单词在一行内出现多次,只打印该行一次.C++的 ...
- [System.Net]模拟Web请求编写简易单词查询客户端
demo: 我就不上传了 前言 在实际生活中,网络请求的应用极其常见,比如使用浏览器,程序中我们还要调用webservice.那么浏览器是怎么请求网络资源的呢?不用它可以自己请求不? 答案是可以的. ...
- C# 有道API翻译 查询单词详细信息
原文:C# 有道API翻译 查询单词详细信息 有道云官方文档 有道云翻译API简介:http://ai.youdao.com/docs/doc-trans-api.s#p01 有道云C#Demo : ...
- ES 20 - 查询Elasticsearch中的数据 (基于DSL查询, 包括查询校验match + bool + term)
目录 1 什么是DSL 2 DSL校验 - 定位不合法的查询语句 3 match query的使用 3.1 简单功能示例 3.1.1 查询所有文档 3.1.2 查询满足一定条件的文档 3.1.3 分页 ...
- coding++:mybatis 嵌套查询子查询column传多个参数描述
mybatis 嵌套查询子查询column传多个参数如下: 2.代码示例 备注:注意,相同颜色的单词都是有关联的 <resultMap id="blogResult" typ ...
- Linq to SQL 语法查询(链接查询,子查询 & in操作 & join,分组统计等)
Linq to SQL 语法查询(链接查询,子查询 & in操作 & join,分组统计等) 子查询 描述:查询订单数超过5的顾客信息 查询句法: var 子查询 = from c i ...
- 关系数据库SQL之基本数据查询:子查询、分组查询、模糊查询
前言 上一篇关系数据库常用SQL语句语法大全主要是关系型数据库大体结构,本文细说一下关系型数据库查询的SQL语法. 语法回顾 SELECT [ALL|DISTINCT] <目标列表达式>[ ...
- Thinkphp查询 1.查询方式 2.表达式查询 3.快捷查询 4.区间查询 5.组合查询 6.统计查询 7.动态查询 8.SQL 查询
1.使用字符串作为条件查询 $user = M('User'); var_dump($user->where('id=1 AND user="蜡笔小新"')->sele ...
- HQL查询——HQL查询的基本用法
HQL查询--HQL查询的基本用法 1.HQL语法类似于SQL语法,但是需要注意的是,HQL是一种完全面向对象的查询语言.SQL语言操作的对象是数据表.列等数据库对象,而HQL语言的操作对象是类.实例 ...
随机推荐
- aircrack-ng无线破解实验
查看无线网卡 airmon-ng 开启网卡监听模式 airmon-ng start wlan0 扫描附近的wifi airodump-ng wlan0mon 停止扫描: ctrl c 使用airodu ...
- python3去除字符串中括号及括号里面的内容
a = """ <option value="search-alias=arts-crafts-intl-ship">Arts & ...
- 多种方法实现左右固定,中间自适应的CSS布局
布局是面试中常问的问题,尤其是这类的题目,怎么答才好呢? 大多数人的第一个方法是浮动,没错,浮动.第二个方法呢?你回答定位,没错.第三个方法呢?.... 第四个方法呢?第五个方法呢?.... 其实能想 ...
- Notes of Daily Scrum Meeting(11.4)
Notes of Daily Scrum Meeting 2014年11月4日 星期二 20:30—21:00 团队成员 今日团队任务 当日工作分配额 完成情况 陈少杰 阅读理解代码中底层与数据库 ...
- 20172332 2017-2018-2 《程序设计与数据结构》Java哈夫曼编码实验--哈夫曼树的建立,编码与解码
20172332 2017-2018-2 <程序设计与数据结构>Java哈夫曼编码实验--哈夫曼树的建立,编码与解码 哈夫曼树 1.路径和路径长度 在一棵树中,从一个结点往下可以达到的孩子 ...
- 关于注册github
- 【CS231N】4、神经网络
一.疑问 二.常用激活函数 1. Sigmoid sigmoid将输入实数值"挤压"到0到1范围内.更具体地说,很大的负数变成0,很大的正数变成1.它对于神经元的激活频率有良好 ...
- 使用成员资格管理用户Membership
ASP.NET成员资格使您可以验证和管理Web应用程序的用户信息.它提供验证用户凭据,创建和修改成员资格用户以及管理用户设置(如密码和电子邮件地址)的功能. ASP.NET成员资格主要用于ASP.NE ...
- 《TCP/IP 详解 卷1:协议》第 10 章:用户数据报协议
引言 UDP 稍微扩展了IP协议,使得包可以在进程间传送,而不仅仅是在主机件.--<CSAPP> IP 数据报是指 IP 层端到端的传输单元.分组(packet)是 IP 层和链路层的传输 ...
- Alpha版本冲刺(七)
目录 组员情况 组员1(组长):胡绪佩 组员2:胡青元 组员3:庄卉 组员4:家灿 组员5:凯琳 组员6:翟丹丹 组员7:何家伟 组员8:政演 组员9:黄鸿杰 组员10:刘一好 组员11:何宇恒 展示 ...