天天看點

C++标準模闆庫與資料結構的學習

  stl(standard template library),即标準模闆庫,是一個具有工業強度的,高效的c++程式庫。它被容納于c++标準程式庫(c++ standard library)中,是ansi/iso c++标準中極具革命性的一部分。該庫包含了諸多在計算機科學領域裡所常用的基本資料結構和基本算法。為廣大c++程式員們提供了一個可擴充的應用架構,高度展現了軟體的可複用性。

  stl中提供的list類,是一個雙向循環連結清單類。從每一個元素(節點),都可以通路前面一個元素和後面一個元素。在stl中,list提供了一系列的成員函數,實則完成的就是連結清單中的基本運算,以及其他在資料結構中不作為基本運算,但在工程中常用到的功能。

  例如:

  list初始化時,申請的空間大小為6,存放下了data中的6個元素,當向lidata插入第7個元素“6”時,list申請新的節點單元,插入到list連結清單中,資料存放結構如下圖所示:

C++标準模闆庫與資料結構的學習

下面的程式,示範了使用list的更完整的過程。可以看到,隻要在頭部使用#include (該頭檔案提供class list的聲明),list類中預置的功能即能夠友善地使用,并且,資料元素的類型,依靠着模闆機制可以自由使用。

  list中提供了豐富的成員函數,用于實作對list的各種操作。這給使用者帶來的友善,背後隐藏的是,經過嚴格的軟體工程流程出廠的産品,在品質上的保證。是以在實際項目的開發中,下面的成員函數,還是建立感情吧。

assign() 給list指派

back() 傳回最後一個元素

clear() 删除所有元素

empty() 如果list是空的則傳回true

end() 傳回末尾的疊代器

erase() 删除一個元素

front() 傳回第一個元素

get_allocator() 傳回list的配置器

insert() 插入一個元素到list中

max_size() 傳回list能容納的最大元素數量

merge() 合并兩個list

pop_back() 删除最後一個元素

pop_front() 删除第一個元素

push_back() 在list的末尾添加一個元素

push_front() 在list的頭部添加一個元素

rbegin() 傳回指向第一個元素的逆向疊代器

remove() 從list删除元素

remove_if() 按指定條件删除元素

rend() 指向list末尾的逆向疊代器

resize() 改變list的大小

reverse() 把list的元素倒轉

size() 傳回list中的元素個數

sort() 給list排序

splice() 合并兩個list

swap() 交換兩個list

unique() 删除list中重複的元素

  哦,原來stl這麼好,資料的存儲結構定義成了類,其中的基本操作和常用功能也用成員函數實作,知道接口,一切搞定,分分鐘的事。

  可以,問題來了。有這麼友善的“基礎設施”,花功夫學資料結構課幹什麼?

  第一,作為專業人員,你可能會做“底層”工作,開發出比stl更好的東東,這個理想可以有,這個需求一直在;

  第二,隻會套接口讀手冊寫代碼的,是碼奴,知道其内部道道,才能夠對現在的庫駕馭自如,才能使用好基礎設施,生産出真正高品質的産品。這裡說的知道,不是入微到每一行代碼都明了,而是對其内部的原理“有感覺”,這是專業人員應該具備的。給内行用的東西,你要成為内行。

  第三,再全的的工具,總有疏漏,當遇到一個需求,基礎設施中沒有時,隻能自己造。沒有資料結構功底,找别人造吧。找别人容易,但問題是,關鍵時候你就撤,撤哪兒去呢?

  第四,資料結構是專業功底,不隻是用來幹活的,還是指導思維的。即使隻說動手能力,到底是hand最重要,還是brain更重要,不言自明。

  在知其然知其是以然的路上,奮進吧。基礎的資料結構,實用的stl,都可以有。

  恰在剛才,一位同學在答疑區說“内容太多太複雜”。我回答:“有什麼辦法?人生來就是要奮鬥的。”當跨過了這座山,回頭卻隻是個小山丘,因為你已經身處高處。

相關連結:

<a href="http://tech.163.com/05/0613/10/1m4ea0us00091589.html">stl入門</a>

<a href="http://zh.cppreference.com/w/cpp">c++參考</a>

<a href="http://blog.csdn.net/sxhelijian/article/details/48395029">資料結構網絡課程首頁</a>

繼續閱讀