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语言的操作对象是类.实例 ...
随机推荐
- Django_事务
介绍 函数说明 from django.db import transaction transaction.atomic # 原子性操作,把一系列操作当做一个整体,错了则集体回退 transactio ...
- XCODE的演变及使用经验分享
IOS编程使用的是XCODE 编译器,安装XCODE你需要一台MAC(黑苹果也可以,个人不推荐,不稳定),然后直接去MAC上的APP STORE上下载安装就行,很简单,再次不做过多介绍... OK,那 ...
- eg_5
问题描述:输入两个字符串,从第一字符串中删除第二个字符串中所有的字符. 例如,输入”They are students.”和”aeiou”,则删除之后的第一个字符串变成”Thy r stdnts.” ...
- unix网络编程——TCP套接字编程
TCP客户端和服务端所需的基本套接字.服务器先启动,之后的某个时刻客户端启动并试图连接到服务器.之后客户端向服务器发送请求,服务器处理请求,并给客户端一个响应.该过程一直持续下去,直到客户端关闭,给服 ...
- TCP源码—epoll源码及测试
一.epoll_create & epoll_create1 SYSCALL_DEFINE1(epoll_create, int, size) sys_epoll_create->sys ...
- 微信小程序demo——入门级(附源码)
最近小程序又蠢蠢欲动,出了一个公众号绑定小程序功能,目测不错,就看了下微信小程序文档,顺便写了几行代码,后续有空会持续更新维护. 源码:https://github.com/SibreiaDante/ ...
- Oracle12c 之后的路线图
Oracle18c 以及 Oracle19c 的原始版本信息 装载一下别人的博客内容 http://www.cnblogs.com/zhjh256/p/9816499.html 感谢原作者.. 另外 ...
- laravel多环境配置(local,testing,production)
根据不同的环境有不同的配置,laravel中,可以把配置写到.env文件中 在系统中,可以使用env(key, "默认值")来获取env中的配置信息 在laravel中运行时,会运 ...
- 删除log日志中包含某个字符的行
sed -i '/{Str}/d' abc.txt 假如你的log日志中某行有sleep字符,直接输入命令: sed -i '/sleep/d' log.log 如果删除的是一个变量的值,假如是var ...
- 通过ClientDataSet复制表的结构及数据
1. 需要2个ClientDataSet组件: 2. clientDataSet1连接目标表,clientDataSet2连接源表,如果无法直接连接,使用DataSetProvider进行桥接: ...