C++STL之vector詳解

一、STL簡介 

       STL 是“Standard Template Library”的縮寫,中文譯爲“標準模板庫”。STL 是 C++ 標準庫的一部分,不用單獨安裝。
       C++ 對模板(Template)支持得很好,STL 就是藉助模板把常用的數據結構及其算法都實現了一遍,並且做到了數據結構和算法的分離。例如,vector 的底層爲順序表(數組),list 的底層爲雙向鏈表,deque 的底層爲循環隊列,set 的底層爲紅黑樹,hash_set 的底層爲哈希表。

       STL 從根本上講是“容器”的集合,也是組件的集合。容器包括 list、vector、set、map 等;組件包括迭代器等。STL 的目的是標準化組件。

        STL 是 C++ 的一部分,不用額外安裝,被內建在支持 C++ 的編譯器中。
        STL 的算法是標準算法,其實現了將已經定義好的算法應用在容器的對象上。

更多STL介紹請看STL是什麼

二、C++ vector簡介

       vector<T> 容器是包含 T 類型元素的序列容器,和 array<T,N> 容器相似,不同的是 vector<T> 容器的大小可以自動增長,從而可以包含任意數量的元素;因此類型參數 T 不再需要模板參數 N。只要元素個數超出 vector 當前容量,就會自動分配更多的空間。只能在容器尾部高效地刪除或添加元素
        vector<T> 容器可以方便、靈活地代替數組。在大多數時候,都可以用 vector<T> 代替數組存放元素。只要能夠意識到,vector<T> 在擴展容量,以 及在序列內部刪除或添加元素時會產生一些開銷;但大多數情況下,代碼不會明顯變慢。 爲了使用 vector<T> 容器模板,需要在代碼中包含頭文件 #include<vector>。

         時間複雜度:該容器隨機存取任何元素都能在常數時間O(1)完成,在尾端增刪元素具有最佳的性能(大部分時間是常數時間,即在不需要重新分配存儲空間的情況下。在一些特殊的情況下需要的時間是O(n),比如當所需要的存儲空間超過了之前動態分配的空間,這時候就需要重新分配存儲空間,需要進行一個數組的拷貝工作)當在vector<T>中間或者頭部插入或者刪除元素所需要的時間複雜度爲O(n)因爲我們需要將後面的元素一次向後移動一個位置。

三、C++ vector的常用方法

#include<iostream>
#include<vector>
using namespace std;

//定義一個輸出vector模板 
/*爲了方便打印不同類型的vector,如果vector的類型比較少
可以使用for循環打印,例如定義一個 vector<int> num;
輸出可以用:
    //輸出num中的內容 size():返回Vector元素數量的大小 
	for(int i=0;i<num.size();i++){
		cout<<num[i]<<" ";	//可以使用[]訪問,也可以使用at()方法訪問
		cout<<num.at(i)<<" ";	//at():返回指定位置的元素    
	}
	cout<<endl;
*/
template<class T>
void printVector(T s,T e){
	for(;s != e;++s){
		cout<<*s<<" ";
	}
	cout<<endl;
}

int main(){
	vector<int> num;    //生成存放 int 型元素的 vector<T> 容器
	cout<<"賦值之前num的容量:"<<num.capacity()<<endl;  //capacity()返回vector所能容納的元素數量(在不重新分配內存的情況下) 
	
	//以初始化列表中的値作爲元素初始值,生成有 6個浮點數的vector容器。
	double a[6] = {1.1,2.6,3.8,4.9,5.6,6.6};
	vector<double> number(a,a+6);
	printVector(number.begin(),number.end());
	
	//string A[4] = {"str1","str2","str3","str4"};
	//vector<string> str(A,A+4);
	
	//str有4個元素,全部初始化爲 "abc" 
	vector<string> str(4,"abc");
	printVector(str.begin(),str.end()); 
	
	//向容器中添加元素 
	for(int i=0;i<10;i++){
		num.push_back(i);	//push_back():在Vector最後添加一個元素
	}
	cout<<"賦值之後num的容量:"<<num.capacity()<<endl;
	
	//輸出num中的內容 size():返回Vector元素數量的大小 
	for(int i=0;i<num.size();i++){
		cout<<num[i]<<" ";	//可以使用[]訪問,也可以使用at()方法訪問 
		cout<<num.at(i)<<" ";	//at():返回指定位置的元素    
	}
	cout<<endl; 
	
	//insert():插入元素到Vector中
	num.insert(num.begin()+3,10);	//將 10 插入到下標爲3的位置 
	
	//begin():返回第一個元素的迭代器  
	//end():返回最末元素的迭代器(譯註:實指向最末元素的下一個位置) 
	printVector(num.begin(),num.end()); 
	
	//將num的一段0,1,2,3,4從下標爲 3 的位置插入 
	num.insert(num.begin()+3,num.begin(),num.begin()+5);
	printVector(num.begin(),num.end());
	
	num.erase(num.begin()+3);	//刪除下標爲 3 位置上的元素 
	printVector(num.begin(),num.end());
	
	//刪除一段元素 
	num.erase(num.begin(),num.end()-2);
	printVector(num.begin(),num.end());
	
	cout<<"刪除前str內容爲:";
	printVector(str.begin(),str.end());
	//刪除所有的元素
	str.clear();
	cout<<"刪除後str內容爲:";
	printVector(str.begin(),str.end());
	
	return 0;
} 

運行結果:

 四、C++ vector的所有方法(更加詳細的內容請參考C++的API:https://en.cppreference.com/w/cpp/container/vector

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