vector的常見用途:
(1)儲存數據
① vector本身可以作爲數組使用,而且在一些元素個數不確定的場合可以很好地節省空間。
②有些場合需要根據一些條件把部分數據輸出在同一行,數據中間用空格隔開。由於輸出數據的個數是不確定的,爲了更方便地處理最後一個滿足條件的數據後面不輸出額外的空格,可以先用 vector記錄所有需要輸出的數據,然後一次性輸出。
(2)用鄰接表存儲圖
vector是在c++標準模板庫中定義的一種“變長數組”,長度可以根據需要自動變化的數組。相對於普通數組會超內存的情況,這種使用vector會讓問題解決便捷很多。
使用vector,需要添加#include<vector>和命名空間“using namespace std”。
以下是vector的常用用法:
1.vector的定義:
(1)一維:
vector<typename> name;
vector<int> name;//int整數類型
vector<node> name;//node結構體類型
vector<vector<int> > name;//vector標準容器類型,記得加空格
typename可以是任何的基本類型,也可以是STL標準容器(如果typename也是一個STL容器,定義的時候要記得在>>符號之間加上空格,防止編譯器將其視爲移位運算符)。
(2)二維:
vector<typename> Arrayname[arraySize];//一維長度是固定的,二維每一個都是vector
vector<vector<int> > name;//一維、二維每一個都是vector
2.vector容器內元素的訪問:
(1)通過下標訪問:
和訪問普通的數組是一樣,對一個定義爲 vector<typename> vi 的 vector 容器來說,直接訪問 vi[index]即可(如vi[0]、vi[1])。當然,這裏下標是從0到 vi.size()-1,訪問這個範圍外的元素可能會運行出錯。
程序代碼:
#include<cstdio>
#include<vector>
using namespace std;
int main(){
vector<int> vi;
for(int i=1;i<=5;i++) {
vi.push_back(i); //在vector後面添加一個元素i
}
for(int i=0;i<vi.size();i++) {
printf("%d ",vi[i]); //通過下標訪問
}
return 0;
}
運行結果:
(2)通過迭代器訪問:
迭代器(iterator)可以理解爲一種類似指針的東西,定義:
vector<typename>::iterator it;
這樣就得到了迭代器it,並且可以通過*it來訪問vector裏面的元素。
下面定義一個vector並且通過迭代器訪問:
程序代碼:
#include<cstdio>
#include<vector>
using namespace std;
int main(){
vector<int> vi;
for(int i=1;i<=5;i++) {
vi.push_back(i);
}
//vi.begin()爲取首元素地址,而it指向這個地址
vector<int>::iterator it = vi.begin();
for(int i=0;i<5;i++) {
printf("%d ",*(it+i)); //輸出vi[i]
}
return 0;
}
運行結果:
- vi[i]和*(vi.begin()+i)是等價的。
- begin()函數是取vi的首元素地址;end()函數是取vi的尾元素的下一個地址,即左閉右開。
此外,迭代器還實現了兩種自加和兩種自減的操作:++it,it++和--it,it--。自增操作如下:
程序代碼:
#include<cstdio>
#include<vector>
using namespace std;
int main(){
vector<int> vi;
for(int i=1;i<=5;i++) {
vi.push_back(i);
}
//vector的迭代器不支持it<vi.end()寫法,因此循環條件只能使用it!=vi.end()
for(vector<int>::iterator it = vi.begin(); it!=vi.end(); it++) {
printf("%d ",*it); //輸出vi[i]
}
return 0;
}
運行結果:
在常用的STL容器中,只有vector和string中,才允許使用vi.begin()+3這種迭代器加上整數的寫法。
3.vector常用函數實例解析:
(1)push_back()
函數作用:push_back(x)就是在vector後面添加一個元素x,時間複雜度爲O(1)。
程序代碼:
#include<cstdio>
#include<vector>
using namespace std;
int main(){
vector<int> vi;
for(int i=1;i<=5;i++) {
vi.push_back(i); //在vector後面添加一個元素i
}
for(int i=0;i<vi.size();i++) { //size()獲取vi中元素的個數
printf("%d ",vi[i]); //通過下標訪問
}
return 0;
}
運行結果:
(2)pop_back()
函數作用:pop_back()刪除vector的尾元素x,時間複雜度爲O(1)。
程序代碼:
#include<cstdio>
#include<vector>
using namespace std;
int main(){
vector<int> vi;
for(int i=1;i<=5;i++) {
vi.push_back(i); //在vector後面添加一個元素i
}
vi.pop_back(); //刪除vector的尾元素
for(int i=0;i<vi.size();i++) { //size()獲取vi中元素的個數
printf("%d ",vi[i]); //通過下標訪問
}
return 0;
}
運行結果:
(3)size()
函數作用:size()獲取vector中元素的個數
程序代碼參考(1)push_back()和pop_back()。
(4)clear()
函數作用:clear()清空vector的所有元素,時間複雜度爲O(N),其中N爲vector中元素的個數。
程序代碼:
#include<cstdio>
#include<vector>
using namespace std;
int main(){
vector<int> vi;
for(int i=1;i<=5;i++) {
vi.push_back(i); //在vector後面添加一個元素i
}
printf("原個數=%d\n",vi.size());
vi.clear(); //清空vector的所有元素
printf("現個數=%d\n",vi.size());
return 0;
}
運行結果:
(5)insert()
函數作用:insert(it,x)用來向vector的任意迭代器it處插入一個元素x,時間複雜度爲O(N),其中N爲vector中元素的個數。
程序代碼:
#include<cstdio>
#include<vector>
using namespace std;
int main(){
vector<int> vi;
for(int i=1;i<=5;i++) {
vi.push_back(i); //在vector後面添加一個元素i
}
vi.insert(vi.begin()+2,-1); //在第三個元素的位置上插入 -1
for(int i=0;i<vi.size();i++) { //size()獲取vi中元素的個數
printf("%d ",vi[i]); //通過下標訪問
}
return 0;
}
運行結果:
insert()還可以用來追加vector容器:
程序代碼:
#include<cstdio>
#include<vector>
using namespace std;
int main(){
vector<int> vi;
vector<int> vi1;
vi1.push_back(9);
vi1.push_back(8);
vi1.push_back(7);
for(int i=1;i<=5;i++) {
vi.push_back(i); //在vector後面添加一個元素i
}
vi.insert(vi.end(),vi1.begin(),vi1.end()); //在第三個元素的位置上插入 -1
for(int i=0;i<vi.size();i++) { //size()獲取vi中元素的個數
printf("%d ",vi[i]); //通過下標訪問
}
return 0;
}
運行結果:
還可以選擇加入的位置:
程序代碼:
#include<cstdio>
#include<vector>
using namespace std;
int main(){
vector<int> vi;
vector<int> vi1;
vi1.push_back(9);
vi1.push_back(8);
vi1.push_back(7);
for(int i=1;i<=5;i++) {
vi.push_back(i); //在vector後面添加一個元素i
}
vi.insert(vi.end()-1,vi1.begin(),vi1.end()); //在第三個元素的位置上插入 -1
for(int i=0;i<vi.size();i++) { //size()獲取vi中元素的個數
printf("%d ",vi[i]); //通過下標訪問
}
return 0;
}
運行結果:
(6)erase()
函數作用:erase()兩種用法:刪除單個元素和刪除一個區間內的所有元素。時間複雜度均爲O(N)。
刪除單個元素:
erase(it)即爲刪除迭代器爲it處的元素。
程序代碼:
#include<cstdio>
#include<vector>
using namespace std;
int main(){
vector<int> vi;
for(int i=1;i<=5;i++) {
vi.push_back(i); //在vector後面添加一個元素i
}
vi.erase(vi.begin()+2); //vi.begin()對應的是vi[0],所以vi.begin()+2對應3
for(int i=0;i<vi.size();i++) { //size()獲取vi中元素的個數
printf("%d ",vi[i]); //通過下標訪問
}
return 0;
}
運行結果:
刪除一個區間內的所有元素:
erase(first,last)即爲刪除[first,last)內的所有元素。
程序代碼:
#include<cstdio>
#include<vector>
using namespace std;
int main(){
vector<int> vi;
for(int i=1;i<=5;i++) {
vi.push_back(i); //在vector後面添加一個元素i
}
vi.erase(vi.begin()+2,vi.begin()+4);
for(int i=0;i<vi.size();i++) { //size()獲取vi中元素的個數
printf("%d ",vi[i]); //通過下標訪問
}
return 0;
}
運行結果:
(6)count
函數作用:記錄vector中元素出現的次數;
程序代碼:
#include<cstdio>
#include<vector>
#include <algorithm>
using namespace std;
int main(){
vector<int>vi;
vi.push_back(200);
vi.push_back(200);
vi.push_back(200);
vi.push_back(400);
vi.push_back(100);
int num1 = count(vi.begin(),vi.end(),200);
int num2 = count(vi.begin(),vi.end(),400);
int num3 = count(vi.begin(),vi.end(),300);
printf("%d %d %d\n",num1,num2,num3);
return 0;
}
運行結果:
(7)複製vector:
-
“=”
直接等號相連:
程序代碼:
#include<cstdio>
#include<vector>
#include<algorithm>
using namespace std;
int main(){
vector<int> A;
A.push_back(0);
A.push_back(4);
A.push_back(4);
A.push_back(2);
vector<int> B;
B = A;
for(vector<int>::iterator it = A.begin(); it!=A.end(); it++) {
printf("%d ",*it);
}
printf("\n");
for(vector<int>::iterator it = B.begin(); it!=B.end(); it++) {
printf("%d ",*it);
}
return 0;
}
運行結果:
這種不會改變vector的長度,長度控制使用assign()函數:
-
assign()函數:
程序代碼:
#include<cstdio>
#include<vector>
#include<algorithm>
using namespace std;
int main(){
vector<int> A;
A.push_back(0);
A.push_back(4);
A.push_back(4);
A.push_back(2);
vector<int> B;
B.assign(A.begin()+1,A.end()-1);
for(vector<int>::iterator it = A.begin(); it!=A.end(); it++) {
printf("%d ",*it);
}
printf("\n");
for(vector<int>::iterator it = B.begin(); it!=B.end(); it++) {
printf("%d ",*it);
}
return 0;
}
運行結果:
(8)swap
函數作用:將兩個vector交換。
程序代碼:
#include<cstdio>
#include<vector>
#include<algorithm>
using namespace std;
int main(){
vector<int> A;
A.push_back(1);
A.push_back(2);
A.push_back(3);
A.push_back(4);
vector<int> B;
B.push_back(4);
B.push_back(3);
B.push_back(2);
B.push_back(1);
A.swap(B);
for(vector<int>::iterator it = A.begin(); it!=A.end(); it++) {
printf("%d ",*it);
}
printf("\n");
for(vector<int>::iterator it = B.begin(); it!=B.end(); it++) {
printf("%d ",*it);
}
return 0;
}
運行結果: