1. 程式人生 > 其它 >C++ STL容器的使用

C++ STL容器的使用

C++的STL(Standard Template Library)全稱——標準模板庫。是C++中很重要的一部分,也是其明顯有別與C語言本身的地方。其很好的體現了C++的面向物件的特點——抽象與封裝,即資料與方法的剝離。

可以說C++若沒有了STL則如同缺失了左膀右臂。程式 = 資料結構 + 演算法,這個演算法極其不嚴格但仍被廣為接受。可以說資料結構和演算法是一個程式軟體的肉體與靈魂,其他則都是身外之物了。

而STL正是對C語言原生的基本資料型別的一次大擴充,使其更容易完成從資料結構的抽象到具體實現。雖然C語言依靠本身的基本資料型別能夠實現基本所有的功能,但是人總歸不願重複的造輪子。而STL就是C++中提供的通用的輪子模板。

STL主要由三部分組成,演算法、容器和迭代器。其被分散組織在13個頭檔案中。使用STL可以實現通用的資料結構,而且由於演算法和容器的充分剝離。不需要對每個新實現的資料結構的實體來過載對應的運算子和演算法。而為了實現這種剝離,總歸是要

有妥協和犧牲的。因此STL中存在了迭代器的概念,其相當於演算法與容器的粘合劑。要用到粘合劑的地方總是有裂縫存在,而這個裂縫正是為了隔離演算法與容器而產生的。為了彌補這個“裂縫”,“粘合劑”要提供一種統一的容器遍歷方式來給演算法。

<vector>

直譯為向量,其實這個名稱和有迷惑性。因為數學上的向量是指一個既有大小又有方向的值,而作為容器來說並沒有也不需要這樣的抽象概念來作為基本的資料結構。因此反倒是翻譯為陣列更合適。

其與基本資料型別的陣列,例如int a[10],其區別在於vector是一個可以容納任意型別(包括結構體和類)資料的動態陣列。其功能更強大,其特點在於:

1.這個容器可以容納結構體或類等自定義的資料型別。

2.其陣列大小可以動態改變。

3.vector和其他容器,例如list相比,可以使用下標進行隨機訪問。讀取資料的時間複雜度為O(1), 插入和刪除的時間複雜度為O(n)。其與deque區別在於其單向開口,向容器尾部插入資料

定義與初始化:

vector<T> test();

vector<T> test((int)iSize);

vector<T> test((int)iSize, (T)tValue);

vector<T> test((T)copy);

vector<T> test((T)copy.begin(), (T)copy.end());

/*T為vector容器中變數的資料型別*/

插入與刪除:

void push_back(const T& t); //向vector的尾部插入一個新元素

void pop_back(); //刪除vector尾部的元素

void insert(iterator it, const T& t); //在迭代器it之前插入資料元素t

void insert(iterator it, int n, const T& t); //在迭代器it之前插入n個數據元素t

void insert(iterator it, const_iterator start, const_iterator emd); //在迭代器it之前插入vector變數的【start,end】區間中的元素

void clear(); //清空vector中的元素,並將其size置為0,但是其capacity還是保持原樣

iterator erase(iterator it); //刪除it指向的元素,並釋放vector的記憶體,將capacity減小1

iterator erase(iterator start, iterator end) //刪除【start,end】區間的元素,並釋放其記憶體,將capacity適量減小

遍歷: