一、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)