Query查询练习,使用map vector

来源:互联网 发布:数据分析技术服务合同 编辑:程序博客网 时间:2024/05/26 12:54
/*************************************************************************
    > 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;
    }

}
*/


0 0