我們的程式將讀取使用者指定的任意文字檔案
,然後允許使用者從該檔案中查詢單詞。查詢的結果是該單詞出現的次數
,並列出每次出現所在的行。如果某單詞在同一行中多次出現
,程式將只顯示該行一次。行號按公升序顯示。
一、查詢程式的設計
設計程式的乙個良好習慣是首先將程式所涉及的操作先列出來,明確需要提供的操作有助於建立需要的資料結構和實現這些行為。從需求出發,我們的程式需要支援以下任務:
1)它必須允許使用者指明要處理的檔案名字。程式將儲存該檔案的內容,
以便輸出每個單詞所在的原始行。
2)它必須將每一行分解為各個單詞,
並記錄每個單詞所在的所有行。在輸出行號時,
應保證以公升序輸出,
並且不重複。
3)對特定單詞的查詢將返回出現該單詞的所有行的行號。
4)輸出某單詞所在的行文字時,
程式必須能根據給定的行號從輸入檔案中獲取相應的行。
1、資料結構
設計乙個簡單的textquery
類來實現這個程式:
1)使用乙個vector
物件來儲存整個輸入檔案。輸入檔案的每一行是該 vector
物件的乙個元素。因而,
在希望輸出某一行時,
只需以行號為下標獲取該行所在的元素即可。
2)將每個單詞所在的行號儲存在乙個set
容器物件中。使用set
就可確保每行只有乙個條目,
而且行號將自動按公升序排列。
3)使用乙個map
容器將每個單詞與乙個
set容器物件關聯起來,
該set
容器物件記錄此單詞所在的行號。
2、操作
對於類還要求有良好的介面。然而,
乙個重要的設計策略首先要確定:
查詢函式需返回儲存一組行號的set
物件。這個返回型別應該如何設計呢?
事實上,
查詢的過程相當簡單:
使用下標訪問map
物件獲取關聯的set
物件即可。唯一的問題是如何返回所找到的set
物件。安全的設計方案是返回該set
物件的副本。但如此一來,
就意味著要複製set
中的每個元素。如果處理的是乙個相當龐大的檔案,
則複製set
物件的代價會非常昂貴。其他可行的方法包括:
返回乙個pair
物件,儲存一對指向set
中元素的迭代器;
或者返回set
物件的 const
引用。為簡單起見,
我們在這裡採用返回副本的方法,
但注意:
如果在實際應用中複製代價太大,
需要新考慮其實現方法。
#include #include #include #include #include #include #include using namespace std;
class textquery
setrun_query(const string &) const; //《輸入需要查詢的字串,返回其所在的行號
string text_line(lin_no) const; //《形參為乙個行號,返回輸入文字中該行號對應的文字行
private:
void store_file(ifstream &);
void build_map();
vectorline_of_text; //《儲存文字中的每一行文字
map> word_map; //《字串對應的行號集合
};void textquery::store_file(ifstream &is)
}void textquery :: build_map()
else
}string textquery::text_line(lin_no line) const
throw out_of_range("line number out of range");
}string make_plural(set::size_type size,const string &begin,const string &ends)
void print_results(const set&locs,
const string &sought,
const textquery &file)
}int main(int argc, char ** argv)
setlocs = tq.run_query(s);
print_results(locs,s,tq);
} return 1;
}
STL應用例項
一 vector的簡單應用 include include int main std cout std endl return 0 二 deque的簡單應用 include include int main std cout std endl return 0 三 list的簡單應用 include...
STL綜合例項 打分系統(一)思路與框架
學校要舉行一場演講比賽,共有24個人參加,按參加順序設定參賽號。比賽共三輪,前兩輪為淘汰賽,第三輪為決賽。第一輪分為4個小組,根據參賽號順序依次劃分,比如100 105為一組,106 111為第二組,依次類推,每組6個人,每人分別按參賽號順序演講。當小組演講完後,淘汰組內排名最後的三個選手,然後繼續...
STL之map學習例項
1 2 include3 include4 include5 include6 include7 include8 include9 using namespace std 1011 define sale depatment 1 銷售部門 12 define develop depatment 2...