STL5 STL綜合例項,文字查詢

2021-06-25 16:50:46 字數 2339 閱讀 1596

我們的程式將讀取使用者指定的任意文字檔案

,然後允許使用者從該檔案中查詢單詞。查詢的結果是該單詞出現的次數

,並列出每次出現所在的行。如果某單詞在同一行中多次出現

,程式將只顯示該行一次。行號按公升序顯示。

一、查詢程式的設計

設計程式的乙個良好習慣是首先將程式所涉及的操作先列出來,明確需要提供的操作有助於建立需要的資料結構和實現這些行為。從需求出發,我們的程式需要支援以下任務:

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