Query查询练习,使用map vector
2014-11-08 21:53
686 查看
/*************************************************************************
> File Name: Query.h
> Author:keson
> Mail:keson@bupt.edu.cn
> Created Time: 2014年11月05日 星期三 16时46分18秒
************************************************************************/
#ifndef _QUERY_H
#define _QUERY_H
#include<fstream>
#include<vector>
#include<string>
#include<sstream>
#include<map>
#include<set>
using namespace std;
class TextQuery
{
public:
TextQuery(std::ifstream &); //构造函数
TextQuery read(ifstream &file,TextQuery &item); //读输入文件
void print(); //打印读入的文件
void account(ifstream &file); //根据输入流将key值和value统计输入map
void query(string &s); //根据单词s打印出所在行
void map_print(); //打印map的key值
private:
vector<string> vec; //用来保存输入的每一行
map<string,set<int>> word_map; //每个单词作为key,行号的set集作为value
};
void TextQuery::map_print() //打印出现的单词
{
auto ret=word_map.begin();
while(ret!=word_map.cend())
{
cout<<ret->first<<" ";
++ret;
}
}
void TextQuery::query(string &s) //根据输入的单词s,打印出所在行
{
auto ret=word_map.find(s);
if(ret!=word_map.cend())
{
auto set_it=(ret->second).cbegin();
while(set_it!=(ret->second).cend())
{
cout<<*set_it<<" "<<vec[*set_it-1]<<endl;
++set_it;
}
}
else
cout<<"could't find";
}
void TextQuery::account(ifstream &file)
{
string fline,word;
int line_num=0;
while(getline(file,fline))
{
++line_num;
istringstream record(fline); //将一行绑定到record流,分解成单词
while(record>>word)
{
auto ret=word_map.find(word);
if (ret!=word_map.cend()) //若该单词已经在map的key值出现,则插入行号
{
ret->second.insert(line_num);
}
else //若未出现,则插入key和对应的value
{
set<int> val={line_num};
word_map.insert(make_pair(word,val));
}
}
}
}
void TextQuery::print() //打印出vec中的内容
{
for(auto c:vec)
cout<<c<<endl;
}
TextQuery TextQuery::read(std::ifstream &file,TextQuery &item)
{
string line;
if(file) //如果打开成功,读入每一行
{
while(getline(file,line))
{
(item.vec).push_back(line);
}
}
else
cerr<<"could't open";
file.close();
return item;
}
TextQuery::TextQuery(std::ifstream &file)
{
read(file,*this); //read读入初始化vec
map<string,set<int>> word_map;
}
#endif
/*************************************************************************
> File Name: Query.cpp
> Author:keson
> Mail:keson@bupt.edu.cn
> Created Time: 2014年11月05日 星期三 16时38分07秒
************************************************************************/
#include<iostream>
#include<fstream>
#include"Query.h"
using namespace std;
int main()
{
ifstream file("storyDataFile");
TextQuery item(file);
item.print();
file.close(); //关闭file流
ifstream file2("storyDataFile"); //重新打开那个文件
item.account(file2);
cout<<"Enter the word you want to find "<<endl;
string s;
cin>>s;
item.query(s);
// item.map_print();
return 0;
}
/*
void runQueries(ifstream &infile);
void runQueries(ifstream &infile)
{
//infile是一个ifstream,指向我们要处理的文件
Text 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;
}
}
*/
> File Name: Query.h
> Author:keson
> Mail:keson@bupt.edu.cn
> Created Time: 2014年11月05日 星期三 16时46分18秒
************************************************************************/
#ifndef _QUERY_H
#define _QUERY_H
#include<fstream>
#include<vector>
#include<string>
#include<sstream>
#include<map>
#include<set>
using namespace std;
class TextQuery
{
public:
TextQuery(std::ifstream &); //构造函数
TextQuery read(ifstream &file,TextQuery &item); //读输入文件
void print(); //打印读入的文件
void account(ifstream &file); //根据输入流将key值和value统计输入map
void query(string &s); //根据单词s打印出所在行
void map_print(); //打印map的key值
private:
vector<string> vec; //用来保存输入的每一行
map<string,set<int>> word_map; //每个单词作为key,行号的set集作为value
};
void TextQuery::map_print() //打印出现的单词
{
auto ret=word_map.begin();
while(ret!=word_map.cend())
{
cout<<ret->first<<" ";
++ret;
}
}
void TextQuery::query(string &s) //根据输入的单词s,打印出所在行
{
auto ret=word_map.find(s);
if(ret!=word_map.cend())
{
auto set_it=(ret->second).cbegin();
while(set_it!=(ret->second).cend())
{
cout<<*set_it<<" "<<vec[*set_it-1]<<endl;
++set_it;
}
}
else
cout<<"could't find";
}
void TextQuery::account(ifstream &file)
{
string fline,word;
int line_num=0;
while(getline(file,fline))
{
++line_num;
istringstream record(fline); //将一行绑定到record流,分解成单词
while(record>>word)
{
auto ret=word_map.find(word);
if (ret!=word_map.cend()) //若该单词已经在map的key值出现,则插入行号
{
ret->second.insert(line_num);
}
else //若未出现,则插入key和对应的value
{
set<int> val={line_num};
word_map.insert(make_pair(word,val));
}
}
}
}
void TextQuery::print() //打印出vec中的内容
{
for(auto c:vec)
cout<<c<<endl;
}
TextQuery TextQuery::read(std::ifstream &file,TextQuery &item)
{
string line;
if(file) //如果打开成功,读入每一行
{
while(getline(file,line))
{
(item.vec).push_back(line);
}
}
else
cerr<<"could't open";
file.close();
return item;
}
TextQuery::TextQuery(std::ifstream &file)
{
read(file,*this); //read读入初始化vec
map<string,set<int>> word_map;
}
#endif
/*************************************************************************
> File Name: Query.cpp
> Author:keson
> Mail:keson@bupt.edu.cn
> Created Time: 2014年11月05日 星期三 16时38分07秒
************************************************************************/
#include<iostream>
#include<fstream>
#include"Query.h"
using namespace std;
int main()
{
ifstream file("storyDataFile");
TextQuery item(file);
item.print();
file.close(); //关闭file流
ifstream file2("storyDataFile"); //重新打开那个文件
item.account(file2);
cout<<"Enter the word you want to find "<<endl;
string s;
cin>>s;
item.query(s);
// item.map_print();
return 0;
}
/*
void runQueries(ifstream &infile);
void runQueries(ifstream &infile)
{
//infile是一个ifstream,指向我们要处理的文件
Text 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;
}
}
*/
相关文章推荐
- 使用WSAIoctl和SIO_ADDRESS_LIST_QUERY去查询本机ip
- 在Query中使用Or查询
- Android 异步查询框架AsyncQueryHandler的使用
- 使用hibernate的this.getSession().createSQLQuery(sql).list();方法查询数据时出现查到的数据和想象的不一致,很是郁闷,诡异
- Android异步查询框架AsyncQueryHandler使用简介
- PRB:ASP 返回“Operation Must Use an Updateable Query”(操作必须使用可更新的查询)错误
- SQVI和SAP查询QUERY的区别和使用注意事项
- subquery(nested query)可以使用主查询中的FROM列出的表中的列
- 对oracle当中子查询建表,merge操作,创建,修改,删除约束,创建使用触发器的复习练习
- spring jdbcTemplate 使用占位符(?)的query方法进行多表查询
- 使用FOR XML将查询结果以XML格式返回(Using the FOR XML Clause to Return Query Results as XML)
- Dojo 1.6 最新官方教程: 如何使用dojo.query 进行DOM查询和批量操作
- 在sharepoint中 使用SPSiteDataQuery来进行跨列表查询
- 在sharepoint中 使用SPSiteDataQuery来进行跨列表查询
- 如何使用dojo.query 进行DOM查询和批量操作
- 使用SPSiteDataQuery和SPQuery查询不到数据
- ?使用SPSiteDataQuery和SPQuery查询不到数据
- 使用MySQL Query Browser最基本查询语句的注释
- Hibernate 使用createSQLQuery查询时,缓存问题
- 关于SubSonic3.0插件使用SubSonic.Query.Select查询时,字段类型为tinyint时列丢失问题的Bug修复