• <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

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

            常用鏈接

            留言簿(8)

            隨筆檔案

            文章檔案

            搜索

            •  

            積分與排名

            • 積分 - 179016
            • 排名 - 147

            最新評論

            閱讀排行榜

            評論排行榜

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

            /*
             *目的:一個簡單的文本查詢程序
             *作用:程序?qū)⒆x取用戶指定的任意文本文件,然后允許用戶從該文件中查找單詞。
             *查詢的結(jié)果是該單詞出現(xiàn)的次數(shù),并列出每次出現(xiàn)所在的行。
             *如果某單詞在同一行中多次出現(xiàn),程序?qū)⒅伙@示該行一次。
             *行號按升序顯示,即第 7 行應(yīng)該在第 9 行之前輸出,依此類推。
             
            */

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

            主函數(shù)

            #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 閱讀(2676) 評論(4)  編輯 收藏 引用

            FeedBack:
            # re: 一個簡單的文本查詢程序—摘至《C++ Primer》 2010-11-12 13:50 xinqikan.com
            有源碼下載看看嗎  回復(fù)  更多評論
              
            # re: 一個簡單的文本查詢程序—摘至《C++ Primer》 2010-11-12 15:43 Tanky Woo
            @xinqikan.com
            額。那個不是源碼嗎?  回復(fù)  更多評論
              
            # re: 一個簡單的文本查詢程序—摘至《C++ Primer》 2010-11-25 13:34 cometrue
            @xinqikan.com
            犀利  回復(fù)  更多評論
              
            # re: 一個簡單的文本查詢程序—摘至《C++ Primer》[未登錄] 2013-02-18 19:17 ming
            要達(dá)到真實狀態(tài)的存在,其實就是對于有效存在的健康的安全,增長,效果的一種反映機制的產(chǎn)生,并且融入自己的真實的屬于自己的真實的生活細(xì)節(jié)當(dāng)中去反映些須能夠觸及的模式  回復(fù)  更多評論
              

            只有注冊用戶登錄后才能發(fā)表評論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


            久久人人爽人人爽人人片AV麻烦| 久久久中文字幕| 色综合久久无码中文字幕| 久久国产精品成人影院| 99久久精品国产一区二区三区| 一本久久综合亚洲鲁鲁五月天亚洲欧美一区二区 | 久久99中文字幕久久| 久久精品国产亚洲一区二区三区| 久久精品国产亚洲αv忘忧草| 中文字幕亚洲综合久久2| 国产成人精品久久| 国产AV影片久久久久久| 亚洲熟妇无码另类久久久| 久久人搡人人玩人妻精品首页| 国产精品一久久香蕉国产线看观看 | 久久99国产一区二区三区| 久久人妻AV中文字幕| 国产免费福利体检区久久| 国产精品禁18久久久夂久| 久久久这里只有精品加勒比| 91精品婷婷国产综合久久| 久久久久亚洲av无码专区导航| 国产精品久久久久久久久软件 | 精品久久久久久无码免费| 国产情侣久久久久aⅴ免费| 亚洲中文字幕久久精品无码APP| 狠狠综合久久综合中文88| 免费精品99久久国产综合精品| 久久精品99久久香蕉国产色戒| 99久久国产精品免费一区二区| 一极黄色视频久久网站| 久久精品国产亚洲av瑜伽| 99精品伊人久久久大香线蕉| 久久91精品国产91久久小草| 久久精品毛片免费观看| 麻豆AV一区二区三区久久| 久久人人爽人人人人片av| 久久久亚洲裙底偷窥综合| 久久中文字幕人妻丝袜| 色播久久人人爽人人爽人人片AV| 亚洲精品无码久久久久AV麻豆|