在上一個專題中,我們介紹了STL中的六大組件,其中容器組件是大多數人經常使用的,因為STL容器是把運用最廣的數據結構實現出來,所以我們寫應用程序時運用的比較多。然而容器又可以序列式容器和關聯式容器兩類,C++語言本身提供了一個序列式容器數組,另外STL又提供vector,list,deque等序列式容器,本專題將詳細介紹下vector容器。
vector容器的數據結構為單端數組,其操作方式與數組的操作非常相似,唯一不同的是——數組是靜態空間,一旦配置了數組大小就不能改變,而vector是動態空間,隨著元素的插入,vector類內部機制會自行擴充空間來容納新的元素,我們不需要擔心因為空間不足而一開始就申請一個空間較大的數組,使用vector更加靈活。vector與C++中數組的區別,如.NET中List<T>類與數組的區別一樣。
vector有8個構造函數,其8個構造函數的定義如下代碼所示:
vector() : _Mybase() { vector( _Alloc& vector(size_type _Count, _Ty& vector(size_type _Count, _Ty& _Val, _Alloc& vector( _Myt& ->_Mylast =-> template< _Iter> template< _Iter> _Alloc&
下面演示下利用上面的構造函數來創建不同的vector對象,並輸出每個vector對象中的元素,具體演示代碼如下所示:
#include <vector><iostream> vector<> vector<> vector<> v1( vector<> v2(, vector<> v3(, vector<> vector<> v5(( index=;index<;index++= vector<> v6(v5.begin()+,v5.begin()+ cout<<(v1_Iter=v1.begin();v1_Iter!=v1.end();v1_Iter++<< <<*<< cout<<(v2_Iter=v2.begin();v2_Iter!=v2.end();v2_Iter++<< <<*<< cout<<(v3_Iter=v3.begin();v3_Iter!=v3.end();v3_Iter++<< <<*<< cout<<(v4_Iter=v4.begin();v4_Iter!=v4.end();v4_Iter++<< <<*<<<< ( v5_Iter = v5.begin( ) ; v5_Iter != v5.end( ) ; v5_Iter++<< << *<<<< ( v6_Iter = v6.begin( ) ; v6_Iter != v6.end( ) ; v6_Iter++<< << *<< vector<><><< ( v7_Iter = v7.begin( ) ; v7_Iter != v7.end( ) ; v7_Iter++<< << *<<
上面演示代碼運行結果如下圖所示:
vector類中提供了很多成員函數,下面演示下一些常用函數使用,具體演示代碼如下:
#include <vector><iostream> print(vector<> &(size_t i=;i<v.size();i++<<v[i]<< << region 元素的遍歷訪問 vector<> vint.push_back( cout<<<<vint[]<<(size_t i=;i <vint.size();i++ cout<<<<i<<<<vint.at(i)<< << endregion region 利用erase函數刪除元素 vint.erase(vint.begin()+<<<<<> (iter=vint.begin(),index1=;iter!=vint.end();iter++,index1++<<<<index1<<<<*iter<< << endregion region 利用pop_back函數刪除尾部元素 <<<<<> (iter1=vint.begin(),j=;iter1!=vint.end();iter1++,j++<<<<j<<<<*iter1<< << endregion region 反向遍歷 vector 的元素 vint.insert(vint.begin()+, vint.insert(vint.end(),<><<<< (iter2=vint.begin(),k=;iter2!=vint.end();iter2++,k++<<<<k<<<<*iter2<< <<<<<<<>( riter=vint.rbegin(),index=;riter!=vint.rend();riter++,index++<<<<index<<<<*riter<< << endregion region 兩個vector容器元素的交換 vector<> <<<<<<<< endregion
上面代碼的運行結果為:
到這裡,本專題的內容介紹結束了,vector向量容器實現為數據線性存儲的泛型類,本文介紹了使用數組下標、at()函數和迭代器方式來進行元素訪問,然後演示了一些常用函數的使用。vector尾部添加和移除元素效率非常高,但在中部或頭部插入元素和刪除元素效率較低,這與它的數據結構(線性連續存儲方式)有著密切的關系。