經(jīng)過前面5篇文章的介紹献宫,看著需要實(shí)現(xiàn)的那般復(fù)雜的代碼,想必不少同學(xué)死的心都有了(來摸摸頭~实撒,要堅(jiān)強(qiáng)啊)姊途。那本篇文章就來跟大家介紹一下,如何在數(shù)據(jù)結(jié)構(gòu)試驗(yàn)中從容開掛吧奈惑。
別想歪了吭净,我是要一本正經(jīng)的介紹 C++ STL。
什么是STL
STL 是 Standard Template Library 的縮寫肴甸。
我們不妨將《C++標(biāo)準(zhǔn)庫——自學(xué)教程與參考手冊》第二版英文版 書中的開篇翻譯過來寂殉,讓大家對于什么 STL 有一個簡單的認(rèn)識。
C++語言在其被發(fā)明后成為了面向?qū)ο笳Z言中事實(shí)上的標(biāo)準(zhǔn)(a de facto standard)原在,這也引發(fā)了標(biāo)準(zhǔn)化的目標(biāo)友扰。只有建立標(biāo)準(zhǔn)才能確保程序在進(jìn)行一次編寫后能在不同硬件平臺上運(yùn)行——從PC到大型機(jī)。此外庶柿,標(biāo)準(zhǔn)庫(a standard library)的建立村怪,能夠使得程序員在使用通用的組件以及更高層次的抽象封裝的同時(shí)又不失可移植性,并且不必從頭開始進(jìn)行編碼工作浮庐。
在C++的第二版中甚负,我們稱之為 C++11,我們可以使用功能更強(qiáng)大的 C++ 標(biāo)準(zhǔn)庫审残,該庫提供對如下功能及概念的支持:
- 輸入/輸出 (I/O) 類梭域;
- 字符串類型與正則表達(dá)式;
- 多種數(shù)據(jù)結(jié)構(gòu)搅轿,例如動態(tài)數(shù)組病涨,鏈接表,二叉樹璧坟,哈希表既穆;
- 多種算法,例如排序算法雀鹃;
- 并發(fā)與多線程類幻工;
- 國際化支持類;
- 數(shù)值類褐澎;
- 其他實(shí)用工具会钝;
可以看出,在 C++ STL 中提供了眾多用于擴(kuò)展語言自身的各類數(shù)據(jù)結(jié)構(gòu)、算法及其他特性的類迁酸。與 C 標(biāo)準(zhǔn)庫 類似先鱼,只要我們合理使用 C++ 標(biāo)準(zhǔn)庫的中各個類及實(shí)用工具,在保證程序健壯性的同時(shí)奸鬓,也可極大的簡化我們編寫的程序的復(fù)雜度焙畔。
如何使用STL
在介紹如何使用STL前,我們來看看STL中與數(shù)據(jù)結(jié)構(gòu)相關(guān)的一些類與容器(container):
- 線性容器:array 串远、vector宏多、deque、forward_list澡罚、list
- 容器適配器(container adaptors):stack伸但、queue、priority_queue
- 關(guān)聯(lián)容器:set留搔、multiset更胖、map、multimap
vector(向量隔显,不定長數(shù)組)却妨、stack(棧)、queue(隊(duì)列)括眠、priority_queue(優(yōu)先隊(duì)列)彪标、set(集合),map(映射) 這些名字看起來熟悉嗎掷豺?沒錯捞烟,這些都是 C++ STL 提供的容器;(天啦嚕~当船,為什么不早說?)
最重要的是坷襟,這些容器還是模板容器(template container),也就是說生年,這些容器存儲的元素對象可以支持各種不同類型。例如廓奕,我需要表示食堂排隊(duì)的隊(duì)伍抱婉,我們可以通過下面代碼來進(jìn)行定義:
#include <queue>
class person
{
string name;
string sex;
...
};
...
int main ()
{
queue<person> myqueue;
myqueue.push_back(person("張三", "male"));
myqueue.push_back(person("李四", "female"));
...
while (!myqueue.empty())
{
// do your work here.
}
...
return 0;
}
我們定義了一個名為 myqueue 的隊(duì)列,隊(duì)列中的元素對象是 person 類實(shí)例桌粉。我們可以通過 queue 容器提供的入隊(duì)蒸绩、出隊(duì)等操作對該隊(duì)列進(jìn)行操作,而這一切僅僅需要我們了解 STL 中每個不同容器的使用接口即可铃肯。
怎么樣患亿?有沒有一種世界頓時(shí)美好的感覺?
對于常用的一些容器,C++ STL 均定義了一個與之名字相同的頭文件步藕,你只需要在使用時(shí)惦界,將其頭文件包含進(jìn)你的源碼中即可。例如咙冗,如果要使用 queue沾歪,你需要在你的原文件中使用#include <queue>
;如果要使用 stack 你需要再你的原文件中使用``#include <stack>```將其引入雾消。
那我該如何了解 C++ STL 的使用灾搏?以下的資源或書籍是 C++ STL 不錯的入門資料:
- www.cplusplus.com 一個非常不錯的介紹C++語言及其標(biāo)準(zhǔn)的英文網(wǎng)站;
- 《C++ 標(biāo)準(zhǔn)庫——自學(xué)教程與參考手冊》第2版英文版立润,人民郵電出版社狂窑;這本書比較厚,分為上下兩冊桑腮;
- 《C++ STL 中文版》中國電力出版社泉哈;這本書比較舊;
STL是萬能的嗎到旦?
STL 提供了一些通用的組件旨巷、算法及實(shí)用工具。但不代表可以用它解決所有問題添忘。
以我們學(xué)習(xí)的數(shù)據(jù)結(jié)構(gòu)中的 二叉樹采呐、圖 等概念和知識點(diǎn)來說,STL 并未提供與之對應(yīng)的容器類搁骑。但我們可以通過對STL中標(biāo)準(zhǔn)的容器類進(jìn)行組合斧吐,構(gòu)造成更復(fù)雜,也符合我們需求的數(shù)據(jù)結(jié)構(gòu)仲器。例如可以使用 vector<vector<int> > graph
表示 圖的鄰接表 表示方式煤率;
通過STL 所提供的通用組件,可以構(gòu)造組合成更為復(fù)雜的容器乏冀,從而用于表示我們所需的數(shù)據(jù)結(jié)構(gòu)蝶糯。而要達(dá)到這一步,則需要我們對 STL 以及所解決問題有充分的理解辆沦。因此昼捍,STL 并不是萬能的,它就如同一把倚天劍或屠龍刀一般肢扯,能否用得好妒茬,取決于使用者的自身武力。如何駕馭 STL 除了需要熟悉 STL 其中各容器蔚晨、算法的使用接口外乍钻,還需要加強(qiáng)自身問題分析、編碼能力。
有同學(xué)會問银择,有了 STL多糠,為什么還要求我們自己動手實(shí)現(xiàn)STL中已有的結(jié)構(gòu)?
因?yàn)槲覀兊恼n程是數(shù)據(jù)結(jié)構(gòu)與算法課程欢摄;(注意熬丧,說此話時(shí),老師做敲黑板動作~~~)
會用工具 與 會制造工具怀挠,你覺得哪種方式會對思維提升更有作用析蝴?知道如何制造工具,會幫助你更好的理解绿淋、使用工具闷畸。
思維與技能是需要時(shí)間積累才會體現(xiàn)出它們價(jià)值。
如何從容開掛
遵循上節(jié)文字的原則吞滞,在需要制造工具時(shí)便制造工具佑菩,在需要使用工具時(shí)便使用工具。
例如裁赠,在 迷宮 問題中殿漠,需要使用棧來記錄搜索路徑,那么此時(shí)應(yīng)該使用工具佩捞,而不是去制造工具绞幌。在樹的層次遍歷中也是如此,既然需要使用隊(duì)列保存遍歷的各節(jié)點(diǎn)一忱,則直接使用 STL 中的 queue 容器即可莲蜘。