• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            隨筆 - 70  文章 - 160  trackbacks - 0

            公告:
            知識共享許可協議
            本博客采用知識共享署名 2.5 中國大陸許可協議進行許可。本博客版權歸作者所有,歡迎轉載,但未經作者同意不得隨機刪除文章任何內容,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。 具體操作方式可參考此處。如您有任何疑問或者授權方面的協商,請給我留言。

            常用鏈接

            留言簿(8)

            隨筆檔案

            文章檔案

            搜索

            •  

            積分與排名

            • 積分 - 179013
            • 排名 - 147

            最新評論

            閱讀排行榜

            評論排行榜

            這是在《C++ Primer》上第十章最后的一個小節。以前把這里漏掉了,剛才看了下,覺得這個程序很不錯,便于對vector, map, set的基本掌握。特地把這一個小程序記錄下來。

            /*
             *目的:一個簡單的文本查詢程序
             *作用:程序將讀取用戶指定的任意文本文件,然后允許用戶從該文件中查找單詞。
             *查詢的結果是該單詞出現的次數,并列出每次出現所在的行。
             *如果某單詞在同一行中多次出現,程序將只顯示該行一次。
             *行號按升序顯示,即第 7 行應該在第 9 行之前輸出,依此類推。
             
            */

            /*思路:
             *1.使用一個 vector<string> 類型的對象存儲整個輸入文件的副本。
             *   輸入文件的每一行是該 vector 對象的一個元素。
             *   因而,在希望輸出某一行時,只需以行號為下標獲取該行所在的元素即可。
             *2.將每個單詞所在的行號存儲在一個 set 容器對象中。
             *   使用 set 就可確保每行只有一個條目,而且行號將自動按升序排列。
             *3.使用一個 map 容器將每個單詞與一個 set 容器對象關聯起來,
             *   該 set 容器對象記錄此單詞所在的行號。
             
            */

            TextQuery.H文件

            #ifndef TEXTQUERY_H
            #define TEXTQUERY_H
            #include 
            <string>
            #include 
            <vector>
            #include 
            <map>
            #include 
            <set>
            #include 
            <iostream>
            #include 
            <fstream>
            #include 
            <cctype>
            #include 
            <cstring>
             
            class TextQuery {
                
            // as before
            public:
                
            // typedef to make declarations easier
                typedef std::string::size_type str_size;
                typedef std::vector
            <std::string>::size_type line_no;
             
                
            /* interface:
                 *    read_file builds internal data structures for the given file
                 *    run_query finds the given word and returns set of lines on which it appears
                 *    text_line returns a requested line from the input file
                
            */
                
            void read_file(std::ifstream &is
                           { store_file(
            is); build_map(); }
                std::
            set<line_no> run_query(const std::string&const
                std::
            string text_line(line_no) const;
                str_size size() 
            const { return lines_of_text.size(); }
                
            void display_map();        // debugging aid: print the map
             
            private:
                
            // utility functions used by read_file
                void store_file(std::ifstream&); // store input file
                void build_map(); // associated each word with a set of line numbers
             
                
            // remember the whole input file
                std::vector<std::string> lines_of_text; 
             
                
            // map word to set of the lines on which it occurs
                std::map< std::string, std::set<line_no> > word_map;  
                
            // characters that constitute whitespace
                static std::string whitespace_chars;     
                
            // canonicalizes text: removes punctuation and makes everything lower case
                static std::string cleanup_str(const std::string&);
            };
            #endif

            TextQuery.CPP 文件

            #include "TextQuery.h"
            #include 
            <sstream>
            #include 
            <string>
            #include 
            <vector>
            #include 
            <map>
            #include 
            <set>
            #include 
            <iostream>
            #include 
            <fstream>
            #include 
            <cctype>
            #include 
            <cstring>
            #include 
            <stdexcept>
             
            using std::istringstream;
            using std::set;
            using std::string;
            using std::getline;
            using std::map;
            using std::vector;
            using std::cerr;
            using std::cout;
            using std::cin;
            using std::ifstream;
            using std::endl;
            using std::ispunct;
            using std::tolower;
            using std::strlen;
            using std::out_of_range;
             
            string TextQuery::text_line(line_no line) const
            {
                
            if (line < lines_of_text.size())
                    
            return lines_of_text[line];
                
            throw std::out_of_range("line number out of range");
            }
             
            // read input file: store each line as element in lines_of_text 
            void TextQuery::store_file(ifstream &is)
            {
                
            string textline;
                
            while (getline(is, textline))
                   lines_of_text.push_back(textline);
            }
             
            // \v: vertical tab; \f: formfeed; \r: carriage return are
            // treated as whitespace characters along with space, tab and newline
            string TextQuery::whitespace_chars(" \t\n\v\r\f");
             
            // finds whitespace-separated words in the input vector
            // and puts the word in word_map along with the line number
            void TextQuery::build_map()
            {
                
            // process each line from the input vector
                for (line_no line_num = 0
                             line_num 
            != lines_of_text.size();
                             
            ++line_num)
                {
                    
            // we'll use line to read the text a word at a time
                    istringstream line(lines_of_text[line_num]);
                    
            string word;
                    
            while (line >> word)
                        
            // add this line number to the set;
                        
            // subscript will add word to the map if it's not already there
                        word_map[cleanup_str(word)].insert(line_num);
                }
            }
             
            set<TextQuery::line_no>
            TextQuery::run_query(
            const string &query_word) const
            {
                
            // Note: must use find and not subscript the map directly
                
            // to avoid adding words to word_map!
                map<stringset<line_no> >::const_iterator 
                                      loc 
            = word_map.find(cleanup_str(query_word));
                
            if (loc == word_map.end()) 
                    
            return set<line_no>();  // not found, return empty set
                else
                    
            // fetch and return set of line numbers for this word
                    return loc->second;
            }
             
            void TextQuery::display_map()
            {
                map
            < stringset<line_no> >::iterator iter = word_map.begin(),
                                                   iter_end 
            = word_map.end();
             
                
            // for each word in the map
                for ( ; iter != iter_end; ++iter) {
                    cout 
            << "word: " << iter->first << " {";
             
                    
            // fetch location vector as a const reference to avoid copying it
                    const set<line_no> &text_locs = iter->second;
                    
            set<line_no>::const_iterator loc_iter = text_locs.begin(),
                                                 loc_iter_end 
            = text_locs.end();
             
                    
            // print all line numbers for this word
                    while (loc_iter != loc_iter_end)
                    {
                        cout 
            << *loc_iter;
             
                        
            if (++loc_iter != loc_iter_end)
                             cout 
            << "";
             
                     }
             
                     cout 
            << "}\n";  // end list of output this word
                }
                cout 
            << endl;  // finished printing entire map
            }
             
             
            // lower-case to upper-case
            string TextQuery::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;
            }

            主函數

            #include "TextQuery.h"
            #include 
            <string>
            #include 
            <vector>
            #include 
            <map>
            #include 
            <set>
            #include 
            <iostream>
            #include 
            <fstream>
            #include 
            <cctype>
            #include 
            <cstring>
            #include 
            <cstdlib>
             
            using std::set;
            using std::string;
            using std::map;
            using std::vector;
            using std::cerr;
            using std::cout;
            using std::cin;
            using std::ifstream;
            using std::endl;
             
            string make_plural(size_t, const string&const string&);
            ifstream
            & open_file(ifstream&const string&);
             
            void print_results(const set<TextQuery::line_no>& locs, 
                               
            const string& sought, const TextQuery &file)
            {
                
            // if the word was found, then print count and all occurrences
                typedef set<TextQuery::line_no> line_nums; 
                line_nums::size_type size 
            = locs.size();
                cout 
            << "\n" << sought << " occurs "
                     
            << size << " "
                     
            << make_plural(size, "time""s"<< endl;
             
                
            // print each line in which the word appeared
                line_nums::const_iterator it = locs.begin();
                
            for ( ; it != locs.end(); ++it) {
                    cout 
            << "\t(line "
                         
            // don't confound user with text lines starting at 0
                         << (*it) + 1 << ""
                         
            << file.text_line(*it) << endl;
                }
            }
             
             
            // program takes single argument specifying the file to query
            int main()
            {
                
            // open the file from which user will query words
                ifstream infile;
                
            if (!open_file(infile, "Tanky_Woo.txt")) {
                    cerr 
            << "No input file!" << endl;
                    
            return EXIT_FAILURE;
                }
             
                TextQuery tq;
                tq.read_file(infile);  
            // builds query map
             
                
            // iterate with the user: prompt for a word to find and print results
                
            // loop indefinitely; the loop exit is inside the while
                while (true) {
                    cout 
            << "enter word to look for, or q to quit: ";
                    
            string s;
                    cin 
            >> s;
             
                    
            // stop if hit eof on input or a 'q' is entered
                    if (!cin || s == "q"break;
             
                    
            // get the set of line numbers on which this word appears
                    set<TextQuery::line_no> locs = tq.run_query(s);
             
                    
            // print count and all occurrences, if any
                    print_results(locs, s, tq);
                 }
                
            return 0;
            }
             
            string make_plural (size_t ctr , const string &word , 
            const string &ending) 

                
            return ( ctr == 1 ) ? word : word + ending; 

             
            ifstream
            & open_file(ifstream &inconst string &file)
            {
                
            in.close();  // close in case it was already open
                in.clear();  // clear any existing errors
             
                
            // if the open fails, the stream will be in an invalid state
                in.open(file.c_str()); // open the file we were given
             
                
            return in// condition state is good if open succeeded
            }
            posted on 2010-11-11 20:16 Tanky Woo 閱讀(2675) 評論(4)  編輯 收藏 引用

            FeedBack:
            # re: 一個簡單的文本查詢程序—摘至《C++ Primer》 2010-11-12 13:50 xinqikan.com
            有源碼下載看看嗎  回復  更多評論
              
            # re: 一個簡單的文本查詢程序—摘至《C++ Primer》 2010-11-12 15:43 Tanky Woo
            @xinqikan.com
            額。那個不是源碼嗎?  回復  更多評論
              
            # re: 一個簡單的文本查詢程序—摘至《C++ Primer》 2010-11-25 13:34 cometrue
            @xinqikan.com
            犀利  回復  更多評論
              
            # re: 一個簡單的文本查詢程序—摘至《C++ Primer》[未登錄] 2013-02-18 19:17 ming
            要達到真實狀態的存在,其實就是對于有效存在的健康的安全,增長,效果的一種反映機制的產生,并且融入自己的真實的屬于自己的真實的生活細節當中去反映些須能夠觸及的模式  回復  更多評論
              
            久久精品一本到99热免费| 精品国产乱码久久久久久浪潮| 亚洲а∨天堂久久精品| 久久精品免费全国观看国产| 亚洲AV日韩精品久久久久久| 久久精品成人免费看| 亚洲精品国产自在久久| 婷婷久久久亚洲欧洲日产国码AV| 欧美亚洲国产精品久久蜜芽 | 99久久精品国产毛片| 久久精品国产精品亚洲下载| 久久久久久国产精品美女| 久久国产成人精品麻豆| 超级碰碰碰碰97久久久久| 久久香蕉一级毛片| 中文无码久久精品| 午夜视频久久久久一区 | 观看 国产综合久久久久鬼色 欧美 亚洲 一区二区| 青青国产成人久久91网| 久久精品无码一区二区WWW| 国产精品成人99久久久久 | 久久er国产精品免费观看2| 久久狠狠爱亚洲综合影院| 91麻精品国产91久久久久| 久久婷婷成人综合色综合| 亚洲精品国产第一综合99久久| 国内精品伊人久久久久影院对白| 久久精品a亚洲国产v高清不卡| 久久无码AV中文出轨人妻| 亚洲国产香蕉人人爽成AV片久久| 国产高清美女一级a毛片久久w| 久久精品免费观看| 亚洲一区中文字幕久久| 色综合久久久久| 狠狠久久综合| 天天影视色香欲综合久久| 久久精品免费大片国产大片| 精品久久综合1区2区3区激情| 国产精品久久久99| 久久婷婷五月综合成人D啪| 亚洲精品99久久久久中文字幕|