简化版文本查询类

原创 2013年12月02日 09:59:24












/*



*/
class TextQuery
{
    public:
        typedef string::size_type str_size;
        typedef vector<string>::size_type line_no;
        void read_file(ifstream &is)
        {
           store_file(is); 
           build_map();
        }
        string text_line(line_no line) const
        {
            if(line<line_of_text.size())
                return line_of_text[line];     
            throw out_of_range("line number out of range");
        }
        set<line_no> run_query(const string& query_word) const;
    private:
        void TextQuery::store_file(ifstream& is)
        {
            string textline;
            while(getline(is, textline))
                line_of_text.push_back(textline);
        }

        void build_map()
        {
            for(line_no line_num=0;
                    line_num!=line_of_text.size();
                    ++line_num)
            {
               istringstream line(line_of_text[line_num]); 
               string word;
               while(line>>word)
                   word_map[cleanup_str(word)].insert(line_num);
            }	            
        }
        static string cleanup_str(const string& word)
        {
            string ret;
            for(string::const_iterator it=word.begin();
                    it!=word.end();
                    ++it)
            {
                if(!ispunct(*it))    
                    ret+=tolower(*it);
            }	
            return ret;
        }
        vector<string> line_of_text; 
        map<string,set<line_no> > word_map;
};

set<TextQuery::line_no> 
TextQuery::run_query(const string& query_word) const
{
	string subword(query_word);
    map<string,set<line_no> >::const_iterator
        it=word_map.find(cleanup_str(subword));
    if(it==word_map.end())
        return set<line_no>(); 
    else
        return it->second;
}

void print_results(const set<TextQuery::line_no>& result,
        const string& querytext,const TextQuery &tq)
{
    typedef set<TextQuery::line_no> lines;
    lines::size_type size=result.size();
    cout<<endl<<querytext<<" occurs "
        <<size<<(size>1?" time ":" times ")<<endl; 
    for(lines::const_iterator it=result.begin();
            it!=result.end();
            ++it)
    {
        stringstream istr;
		istr<<"\t"<<"line("<<((*it)+1)<<")";
        cout<<setw(10)<<left<<istr.str();
        cout<<setw(10)<<left<<tq.text_line(*it)<<endl;
    }
    

}

int main(int argc, const char *argv[])
{
    ifstream infile;
    string filename(__FILE__);
    infile.close();
    infile.clear();
    infile.open(filename.c_str());
    TextQuery tq;
    tq.read_file(infile);
    string query_word;
    set<TextQuery::line_no> result;
    while(cin>>query_word && query_word!="q" )
    {
        result=tq.run_query(query_word);
        print_results(result,query_word, tq);
    }
        
    system("pause");
    return 0;
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

Boyer–Moore–Horspool文本匹配算法(BM算法的简化版)

英语里有句习语叫"find a needle in a haystack",译成中文叫"大海捞针"(原意是在一堆干草中寻找一根针)。计算机中的文本匹配(string matching)就是要解决怎样在...

AS3 没有2D向量类,自己随手写个简化版的先用着

用不着,叉乘、点乘,暂时写这么多,之前自己写的一个比较详细的,放在家了,目前要用这个简化版的: package model { /** * 简化版向量类 * @author Jav...

简化版Linux安装redis默认配置

$ wget http://download.redis.io/releases/redis-2.8.17.tar.gz $ tar xzf redis-2.8.17.tar.gz $ cd redi...

一个简化版的仿微信聊天界面UI

简化了原web微信的页面结构,纯粹前端页面,上图:

Linux ls 命令实现(简化版)

在学习linux系统编程的时候,实现了ls命令的简化版本。 实现的功能如下: 1. 每种文件类型有自己的颜色 (- 普通文件, d 目录文件, l 链接文件, c 字符设备文件, b 快设备文件, p...

js 根据输入具体时间倒计时

输入具体时间,进行倒计时

java计算器 图形用户界面 简化版

package com.rgy.entity; import java.awt.*; import java.awt.event.*; @SuppressWarnings("serial") pu...

[Linux高级编程] Makefile简化版

1 语法 目标名:依赖目标                         @命令    ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)