C++中Standard Template Library(STL)入門簡要概況

STL在C++中算是相當簡潔方便的東西了,但不知爲何網上的教程都非常難,給新手入門造成了非常多的困擾。在此寫篇新手入門教程。閱讀此文需要有一定的C/C++基礎,比如你要會用C語言的數組、鏈表等,會用C++類並且有一定了解等等,不會的還是別看了,就算你會用STL你也會發現有各種各樣的bug。

本篇只介紹STL最基礎的部分,其他的調用方式等等都差不多了。本篇不會講解太多,具體需要自己去研究進入正題

(1) vector

很神奇的一個詞彙,翻譯成漢語是“向量”,其實,這就是一個C++類,用於實現變長數組的功能。特性:一個vector只能存儲一種數據類型,不能像VB那樣屌。

#include <vector>
using namespace std;
使用vector前需要在代碼前面加上上面兩句,用於引入vector庫。
然後定義一個可以存儲int類型數據的變長數組

vector<int> v;
定義完畢之後,向數組中插入數據

v.resize(3);
v[0] = 1;
v[1] = 4;
v[2] = 3;

分配三個存儲空間,然後對其進行賦值。其中resize可以省略。

C++爲了效率,在resize參數小於容器總容量時,並不會釋放掉多餘的空間,而是do nothing。

上面體現了一個數組的特性,但還沒體現動態數組吧。下面介紹數組的動態擴展。

v.push_back(2);

這句話的意思是再向數組末尾插入 2 這個數據。數組的長度爲3,當長度不足時,vector將會自動擴展空間。默認長度變爲原來兩倍。可通過v.capacity()獲取總容量,也可通過v.size()獲取已儲存的數據個數。

不同的編譯器廠家對STL的實現有一定的區別,比如自動增長,有些編譯器可能不是直接2倍,而是1.5倍之類的,比如vs某個版本就是1.25倍,使容器中有效數據始終保持在80%以上。

(2)遍歷

for (std::vector<int>::iterator i = v.begin(); i != v.end(); i++) {
	cout << *i << endl;
}
上面代碼就是遍歷並打印數據了。可以看到打印結果爲  1 4 3 2

std::vector<int>::iterator這句話有點長啊,其實意思就是 std::vector<int> (數組類型)的 iterator (索引器),專門用來索引這種數組用的。v.begin()爲數組v的起始位置,也就是指向數組第一個元素 0 的指針。v.end() 爲數組最後一個元素的後一位,爲NULL的指針,i++表示索引器向下移動一位。

上面的迭代類型可以用auto表示,也可以decltype,也可以用基於範圍的for循環:

for (int i : v) {
	cout << i << endl;
}
寫法上比上面更簡潔。另外在C++14中引入了靜態迭代,在迭代中的迭代子是const數據,避免修改導致出錯
for (std::vector<int>::const_iterator i = v.cbegin(); i != v.cend(); i++) {
	cout << *i << endl;
}

(3)簡要概況

stl集合了變長數組、鏈表、隊列、圖、哈希表等等一大堆常用數據結構,且使用的最優算法。

避免低效事件,比如在數組開始地方或中間插入元素,這幾乎將要移動整個數組。如果確實有需要,可以考慮使用雙端隊列。

[]索引爲了效率不會有錯誤判斷,如果有需要,使用at()索引。

STL還封裝了常用算法,引入 #include <algorithm> 頭文件,可以使用sort排序函數等函數,支持默認排序以及自定義排序

sort(v.begin(), v.end());
除了默認排序外,sort也支持自定義排序。

v.capacity()爲佔用空間大小,爲避免過多內存切換,調用v.clear()並不會真正釋放空間。只有在析構和swap時纔會釋放空間。push在頂部插入數據,pop彈出頂部數據,empty檢查是否爲空。另外對於vector這類可以通過下標訪問數據的來說,下標訪問並不會檢查邊界,用.at()會檢查是否越界。

(4)stl常用容器

常用包括vector向量(動態數組)、list(雙端鏈表)、slist(單鏈表)、map(哈希表)、set(有序集合紅黑樹)、dictionary(字典)、queue(隊列)、deque(雙端隊列)、priority_queue(優先隊列)


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章