在數(shù)據(jù)結(jié)構(gòu)實(shí)驗(yàn)中從容開掛—如何使用C++ STL

經(jīng)過前面5篇文章的介紹献宫,看著需要實(shí)現(xiàn)的那般復(fù)雜的代碼,想必不少同學(xué)死的心都有了(來摸摸頭~实撒,要堅(jiān)強(qiáng)啊)姊途。那本篇文章就來跟大家介紹一下,如何在數(shù)據(jù)結(jié)構(gòu)試驗(yàn)中從容開掛吧奈惑。

別想歪了吭净,我是要一本正經(jīng)的介紹 C++ STL

什么是STL

STLStandard 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)?

  1. 因?yàn)槲覀兊恼n程是數(shù)據(jù)結(jié)構(gòu)與算法課程欢摄;(注意熬丧,說此話時(shí),老師做敲黑板動作~~~

  2. 會用工具會制造工具怀挠,你覺得哪種方式會對思維提升更有作用析蝴?知道如何制造工具,會幫助你更好的理解绿淋、使用工具闷畸。

  3. 思維與技能是需要時(shí)間積累才會體現(xiàn)出它們價(jià)值。

如何從容開掛

遵循上節(jié)文字的原則吞滞,在需要制造工具時(shí)便制造工具佑菩,在需要使用工具時(shí)便使用工具。

例如裁赠,在 迷宮 問題中殿漠,需要使用棧來記錄搜索路徑,那么此時(shí)應(yīng)該使用工具佩捞,而不是去制造工具绞幌。在樹的層次遍歷中也是如此,既然需要使用隊(duì)列保存遍歷的各節(jié)點(diǎn)一忱,則直接使用 STL 中的 queue 容器即可莲蜘。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市帘营,隨后出現(xiàn)的幾起案子票渠,更是在濱河造成了極大的恐慌,老刑警劉巖芬迄,帶你破解...
    沈念sama閱讀 212,294評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件问顷,死亡現(xiàn)場離奇詭異,居然都是意外死亡禀梳,警方通過查閱死者的電腦和手機(jī)择诈,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,493評論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來出皇,“玉大人,你說我怎么就攤上這事哗戈〗妓遥” “怎么了?”我有些...
    開封第一講書人閱讀 157,790評論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長纱注。 經(jīng)常有香客問我畏浆,道長,這世上最難降的妖魔是什么狞贱? 我笑而不...
    開封第一講書人閱讀 56,595評論 1 284
  • 正文 為了忘掉前任刻获,我火速辦了婚禮,結(jié)果婚禮上瞎嬉,老公的妹妹穿的比我還像新娘蝎毡。我一直安慰自己,他們只是感情好氧枣,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,718評論 6 386
  • 文/花漫 我一把揭開白布沐兵。 她就那樣靜靜地躺著,像睡著了一般便监。 火紅的嫁衣襯著肌膚如雪扎谎。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,906評論 1 290
  • 那天烧董,我揣著相機(jī)與錄音毁靶,去河邊找鬼。 笑死逊移,一個胖子當(dāng)著我的面吹牛预吆,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播螟左,決...
    沈念sama閱讀 39,053評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼啡浊,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了胶背?” 一聲冷哼從身側(cè)響起巷嚣,我...
    開封第一講書人閱讀 37,797評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎钳吟,沒想到半個月后廷粒,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,250評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡红且,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,570評論 2 327
  • 正文 我和宋清朗相戀三年坝茎,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片暇番。...
    茶點(diǎn)故事閱讀 38,711評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡嗤放,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出壁酬,到底是詐尸還是另有隱情次酌,我是刑警寧澤恨课,帶...
    沈念sama閱讀 34,388評論 4 332
  • 正文 年R本政府宣布,位于F島的核電站岳服,受9級特大地震影響剂公,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜吊宋,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,018評論 3 316
  • 文/蒙蒙 一纲辽、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧璃搜,春花似錦拖吼、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,796評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至橘原,卻和暖如春籍铁,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背趾断。 一陣腳步聲響...
    開封第一講書人閱讀 32,023評論 1 266
  • 我被黑心中介騙來泰國打工拒名, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人芋酌。 一個月前我還...
    沈念sama閱讀 46,461評論 2 360
  • 正文 我出身青樓增显,卻偏偏與公主長得像,于是被迫代替她去往敵國和親脐帝。 傳聞我的和親對象是個殘疾皇子同云,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,595評論 2 350

推薦閱讀更多精彩內(nèi)容