在C中,有很多東西需要自己實現。C++提供了標准模板庫(Standard Template Libray,STL),其中封裝了很多容器,不需要費力去實現它們的細節而直接調用函數來實現功能。
具體容器鏈接:set,string,map,queue,priority_queue,stack,pair
1、vector的用法
vector:向量,這里叫“變長數組”,長度根據需要而自動改變的數組。有時會碰到普通數組會超過內存的情況,可以使用vector解決。而且,vector可以用來以鄰接表的方式存儲圖,可以解決當節點數太多,無法使用鄰接矩陣,又害怕使用指針實現鄰接表的時候,使用很簡單。
使用vector,需要添加頭文件,#include<vector>,還要頭文件下加入using namespace std;
1.1、vector的定義
vector<typename> name;
相當於定義了一個一維數組name[SIZE],只不過size可以根據需要進行變化,比較節省空間,也就是變長數組
typename:任何基本類型,int,char,double,結構體,STL容器vector,set,queue等。
如果typename是STL容器,定義的時候要在>>之后加上空格,如果不加空格,編譯器就把它認為是位操作。
vector<int> stu; vector<double> stu; vector<char> stu; vector<Node> stu;//Node是結構體類型 vector<vector<int>> name;
二維數組的定義:一維是一個數組的數組
vector<typename> Arrayname[arraySize]
/*Arrayname[]的每一個元素都是一個vector,可以理解為兩個維都是可變長的二維數組*/
寫法一:vector<int> vi[100];//一維長度已經固定為arraySize
vi[0]~vi[99]中每一個都是一個vector容器。
寫法二:vector<vector<int>> vi//區別:這個兩個維度是變長的
1.2、vector容器內元素的訪問
vector訪問方式:下標訪問、迭代器訪問。
1.2.1、下標訪問
和訪問普通數組一樣,下標從0~size()-1。
比如定義的:vector<typename> vi,使用vi[index](vi[0],vi[1])。
1.2.2、通過迭代器訪問
迭代器(iterator)理解為類似指針的東西。
定義:vector<typename>::iterator it;//it是一個迭代器變量。

#include<stdio.h> #include<vector> using namespace std; int main() { vector<int> vi; for(int i=0;i<5;i++) { vi.push_back(i); } vector<int>::iterator it=vi.begin();//vi.begin()是vi的首元素地址,用迭代器變量it指向這個地址 for(int i=0;i<5;i++) { printf("%d\n",*(it+i));//輸出vi[i]; } return 0; }
注:vi[i]與*(vi.begin()+i)等價
end()函數:並不是取vi的尾元素地址,而是取尾元素的下一個地址。就相當於左閉右開區間。

#include<stdio.h> #include<vector> using namespace std; int main() { vector<int> vi; for(int i=0;i<5;i++) { vi.push_back(i); } vector<int>::iterator it=vi.begin();//vi.begin()是vi的首元素地址,用迭代器變量it指向這個地址 for(int i=0;i<5;i++) { printf("%d\n",*(it+i));//輸出vi[i]; } //使用begin(),end()函數,訪問 for(vector<int>::iterator it=vi.begin();it!=vi.end();it++) { printf("%d\n",*it); } return 0; }
注:在常用STL容器中,只有vector和string才可以使用vi.begin()+i這種迭代器加整數的寫法,因為他們兩個看做數組的下標的訪問方式。
1.3、vector常用函數
1.3.1、push_back()函數
push_back(x)就是在vector后面添加一個元素x,時間復雜度為O(1)。
1.3.2、pop_back()函數
pop_back(x)就是刪除vector的尾元素x,時間復雜度為O(1)。
1.3.3、size()函數
用來獲得vector中元素的個數,時間復雜度為O(1)。
1.3.4、clear()函數
用來清空vector所有的元素,時間復雜度為O(N),N為元素總個數。
1.3.5、insert()函數
用insert(it,x)往vector的任意迭代器it初傳入一個元素x。時間復雜度為O(N)。
1.3.6、erase()函數
用erase()函數刪除單個元素,或者一個區間的元素

#include<stdio.h> #include<vector> using namespace std; int main() { vector<int> vi; for(int i=0;i<5;i++) { vi.push_back(i);//jpush_back()函數應用 } vi.pop_back(i);//刪除vi的尾部元素4 int i=vi.size();//size()返回的unsingned類型 vi.clear();//清空vector所有元素 vi.insert(vi.begin()+2,23);//將23插入vi[2]的位置 vi.erase(vi.begin()+1);//刪除單個元素vi[1]; vi.erase(vi.begin()+1,vi.begin()+3);//刪除vi[1],vi[2],左閉右開區間 return 0; }
1.4、vector常見用途
1.4.1、存儲數據
vector本身可以作為數組使用,當元素個數不確定的時候,可以很好地節省空間。
有些時候需要把部分數據輸出在同一行,用空格隔開數據。由於數據的個數不知道,
可以使用vector記錄所有的需要輸出的數據,然后一次性輸出。
1.4.2、用鄰接表存儲圖
可以使用vector實現鄰接表,避免使用指針的鄰接鏈表。
2018-09-25 14:24:20 @author:Foreordination