您的位置:首页 > 产品设计 > UI/UE

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;

    }

}

*/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: