1. 程式人生 > >第十五章 字串(一)

第十五章 字串(一)

    第十五章是《程式設計珠璣》的最後一章,本章由易到難圍繞字串處理主要分三個部分:1,單詞。2,短語。3,文字。在這三個問題中涉及到的技術有C++中的標準模板庫,雜湊表,新介紹的一種資料結構“字尾陣列”。先從第一個部分“單詞”入手。

    “我們的第一個問題是為文件中包含的單詞生成一個列表”。這個問題用C++標準模板庫中的set和string可以很容易解決。

  1. // Sorted list of words(between white space) in file 
  2. #include <iostream>
  3. #include <string>
  4. #include <set>
  5. usingnamespace std;  
  6. int main()  
  7. {  
  8.     string str;  
  9.     set<string> S;  
  10.     set<string>::iterator i;  
  11.     //while((cin>>str) != EOF)
  12.     while(cin>>str)  
  13.         S.insert(str);  
  14.     for(i=S.begin(); i!=S.end(); i++)  
  15.         cout<<*i<<endl;  
  16.     return 0;  
  17. }  
這裡需要注意的問題是C++的標準輸入函式cin()的用法,其自動識別空格,並且在輸入終止符後自動退出,在我的編譯環境下為Ctrl+Z加回車。

    “接下來的問題是對文件中每個單詞的出現次數進行統計”。這個問題利用map容器即可方便地解決。

  1. // Sorted list of words and counts in file 
  2. #include <iostream>
  3. #include <string>
  4. #include <map>
  5. usingnamespace std;  
  6. int main()  
  7. {  
  8.     //int count=0;
  9.     string str;  
  10.     map<string, int> M;  
  11.     map<string, int>::iterator i;  
  12.     //while((cin>>str) != EOF)
  13.     /* 
  14.     while(cin>>str) 
  15.         M.insert(str, ++count); 
  16.     for(i=S.begin(); i!=S.end(); i++) 
  17.         cout<<(*i)->first<<"\t"<<(*i)->second<<endl; 
  18.     */
  19.     /* 
  20.     while(cin>>str) 
  21.         M.insert(make_pair(str, ++count)); 
  22.     */
  23.     while(cin>>str)  
  24.         M[str]++;  
  25.     for(i=M.begin();i!=M.end();++i)  
  26.         cout<<i->first<<"\t"<<i->second<<endl;      
  27.     return 0;  
  28. }  
這裡面主要需要注意的問題就是map的用法。

    程式達人們為了追求效率,減少處理的時間,對這個程式進行改進,定製了散列表,將字串通過雜湊演算法分佈到散列表中,這樣就很有效地減少了程式執行過程中“插入”和“輸出”的時間,據書中的記載是這個演算法處理有29131個