STL(Standard Template Library),即標准模板庫,是一個具有工業強度的,高效的C++程序庫。它被容納於C++標准程序庫(C++ Standard Library)中,是ANSI/ISO C++標准中極具革命性的一部分。該庫包含了諸多在計算機科學領域裡所常用的基本數據結構和基本算法。為廣大C++程序員們提供了一個可擴展的應用框架,高度體現了軟件的可復用性。
STL中提供的list類,是一個雙向循環鏈表類。從每一個元素(節點),都可以訪問前面一個元素和後面一個元素。在STL中,list提供了一系列的成員函數,實則完成的就是鏈表中的基本運算,以及其他在數據結構中不作為基本運算,但在工程中常用到的功能。
例如:
int data[6]={3,5,7,9,2,4};
list lidata(data, data+6); //list是個模板類,用表明,其數據元素為int型
lidata.push_back(6);
...
list初始化時,申請的空間大小為6,存放下了data中的6個元素,當向lidata插入第7個元素“6”時,list申請新的節點單元,插入到list鏈表中,數據存放結構如下圖所示:
下面的程序,演示了使用list的更完整的過程。可以看到,只要在頭部使用#include (該頭文件提供class list的聲明),list類中預置的功能即能夠方便地使用,並且,數據元素的類型,依靠著模板機制可以自由使用。
#include
#include
#include
#include
using namespace std;
//創建一個list容器的實例LISTINT
typedef list LISTINT;
//創建一個list容器的實例LISTCHAR
typedef list LISTCHAR;
int main()
{
//--------------------------
//用list容器處理整型數據
//--------------------------
//用LISTINT創建一個名為listOne的list對象
LISTINT listOne;
//聲明i為迭代器
LISTINT::iterator i;
//從前面向listOne容器中添加數據
listOne.push_front (2);
listOne.push_front (1);
//從後面向listOne容器中添加數據
listOne.push_back (3);
listOne.push_back (4);
//從前向後顯示listOne中的數據
cout<
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這麼好,數據的存儲結構定義成了類,其中的基本操作和常用功能也用成員函數實現,知道接口,一切搞定,分分鐘的事。
可以,問題來了。有這麼方便的“基礎設施”,花功夫學數據結構課干什麼?
第一,作為專業人員,你可能會做“底層”工作,開發出比STL更好的東東,這個理想可以有,這個需求一直在;
第二,只會套接口讀手冊寫代碼的,是碼奴,知道其內部道道,才能夠對現在的庫駕馭自如,才能使用好基礎設施,生產出真正高質量的產品。這裡說的知道,不是入微到每一行代碼都明了,而是對其內部的原理“有感覺”,這是專業人員應該具備的。給內行用的東西,你要成為內行。
第三,再全的的工具,總有疏漏,當遇到一個需求,基礎設施中沒有時,只能自己造。沒有數據結構功底,找別人造吧。找別人容易,但問題是,關鍵時候你就撤,撤哪兒去呢?
第四,數據結構是專業功底,不只是用來干活的,還是指導思維的。即使只說動手能力,到底是hand最重要,還是brain更重要,不言自明。
在知其然知其所以然的路上,奮進吧。基礎的數據結構,實用的STL,都可以有。
恰在剛才,一位同學在答疑區說“內容太多太復雜”。我回答:“有什麼辦法?人生來就是要奮斗的。”當跨過了這座山,回頭卻只是個小山丘,因為你已經身處高處。