vector常用解法及詳解

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容器中,只有vectorstring中,才允許使用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; 
}

運行結果:

 

 

 

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