【C++/STL】2. vector向量

  • vector與常用的數組類似,佔用連續內存空間,對隨機存取支持很好。可以類似數組用下標訪問,也可以類似字符串用vector.at()成員函數訪問
  • vector是尾部開口設計,類似棧。從尾部插入數據效率最高(push_back()函數)
  • vector可以自動實現動態空間申請和釋放,使用簡便
  • vector定義於 vector.h,命名空間std

一、構造函數

編號 構造函數 解釋
1 vector<T>(); 創建一個沒有任何元素的向量
2 vector<T>(vector & _Right); 創建一個向量,並用另一個向量_Rigth初始化它
3 vector<T>(size_type nSize); 創建一個大小爲nSize的向量
4 vector<T>(size_type nSize , const_type _Val); 創建一個大小爲nSize的向量,全部初始化爲Val
5 vector<T>(InputIterator _First , InputIterator _last) 創建一個向量,並以迭代器 _First和 _last之間的元素初始化該向量
  • T可以是intfloat等類型,也可以是自定義的類
#include <iostream>
#include <vector> 
using namespace std;

int main()
{
	vector<int>::iterator v1_Iter, v2_Iter,v3_Iter,v4_Iter,v5_Iter,v6_Iter;	//定義vector迭代器
	
	//創建一個長度爲3,初始值爲0的向量          (構造函數3) 
	vector<int>v1(3);
	cout<<"v1=";
	for(v1_Iter=v1.begin();v1_Iter!=v1.end();v1_Iter++)
		cout<<" "<<*v1_Iter;
	cout<<endl;
	
	//創建一個長度爲5,初始值爲2的向量          (構造函數4) 
	vector<int>v2(5,2);
	cout<<"v2=";
	for(v2_Iter=v2.begin();v2_Iter!=v2.end();v2_Iter++)
		cout<<" "<<*v2_Iter;
	cout<<endl;
	
	//創建一個int向量,用v2初始化它	          (構造函數2) 
	vector<int>v3(v2);
	cout<<"v3=";
	for(v3_Iter=v3.begin();v3_Iter!=v3.end();v3_Iter++)
		cout<<" "<<*v3_Iter;
	cout<<endl;
	
	//創建一個int向量,用v2的部分元素初始化它	  (構造函數5) 
	vector<int>v4(v2.begin()+1,v2.begin()+3);
	cout<<"v4=";
	for(v4_Iter=v4.begin();v4_Iter!=v4.end();v4_Iter++)
		cout<<" "<<*v4_Iter;
	cout<<endl;
	
	//創建一個空int向量                        (構造函數1) 
	vector<int>v5; 
	cout<<"v5=";
	for(v5_Iter=v5.begin();v5_Iter!=v5.end();v5_Iter++)
		cout<<" "<<*v5_Iter;
	cout<<endl;
	
	return 0;
}
  • 注意vector重載了運算符=,可以用=在兩個對象間複製數據

二、vector元素操作

  • 以下介紹部分vector的常用操作,不全

1、靜態vector

  1. const vector<int> ivec(...); 這樣的定義,是指ivec容器中所有元素都是const
const vector<int> ivec(10,10);
ivec[0] = 1;		//報錯,此處返回的是一個const int 	
  1. vector<const int> ivec(...);這樣的定義,會被編譯器當做vector<int>處理
vector<const int> ivec2(10, 10); 	//通過
ivec2[0] = 1;					    //通過

2、讀向量容器元素的操作

  • 這個表裏所有pos都是size_type型變量,調用時寫數字,從0開始
函數 功能 調用示例
reference front(); 返回第一個元素的引用 v1.front();
const_reference front() const; 返回第一個元素的常引用(const vector) v1.front();
reference back(); 返回最後一個元素的引用 v1.back();
const_reference back() const; 返回最後一個元素的常引用(const vector) v1.back();
reference opreator [] (size_type Pos); 返回Pos指定位置上的元素的引用 v1[Pos]
reference at(size_type Pos); 返回Pos指定位置上的元素的引用 v1.at(Pos);
const_reference operator [] (size_type_Pos) const; 返回Pos指定位置上的元素的常引用(const vector) v1[Pos]
const_reference at(size_type Pos) const; 返回Pos指定位置上的元素的常引用(const vector) v1.at(Pos);
  • 這個表裏所有pos·都是iterator迭代器類型,這幾個常用在for循環中遍歷vcetor
函數 功能 調用示例
iterator begin() 返回向量頭指針,指向第一個元素 v1.begin()
iterator end() 返回向量尾指針,指向最後一個元素後面 v1.end()
reverse_iterator rebegin() 反向迭代器,指向最後一個元素 v1.rebegin()
iterator rend() 反向迭代器,指向第一個元素前面 v1.rend()

3、改變數據的成員函數

  • 注意,以下都是vector對象的成員函數
  • 這個表裏所有pos·都是iterator迭代器類型
函數 功能 調用示例
void clear() 刪除容器中所有元素 v1.clear()
iterator erase(pos) 刪除容器中pos位置元素 v1.erase(v.begin())
iterator erase(beg , end) 刪除beg到end-1間所有元素 v1.erase(v1.begin()+1 , v1.begin()+5)
iterator insert(iterator pos , const T &elem) 在pos位置插入一個元素elem v1.insert(v1.begin()+1 , 200);
void insert(iterator pos , int n, const T &elem) 在pos位置前插入元素elem的n個拷貝 v1.insert(v1.begin()+1 , 3 , 200);
void insert(iterator pos , const_iterator beg , const_iterator end) 將另一vector從beg到end-1間所有元素的拷貝插入pos位置前 v.insert(v.begin(),v.begin()+4,v.begin()+7);
void push_back(elem) 將elem的一個拷貝插入容器末尾 v1.push_back(10);
void pop_back() 刪除一個末尾元素 v1.pop_back():
void resize(size_type num) 將元素個數改爲num。如果size()增加,由默認構造函數創建新元素 v1.resize(10);
void resize(size_type num,elem) 將元素個數改爲num。如果size()增加,由默認構造函數將其初始化爲elem v1.resize(10,0);
void swap (vector &) 交換兩個同類型向量的數據 v1.swap(v2)
void assign(int n , const T &x) 設置容器大小爲n個元素,每個值爲x v1.assign(10 0)

4、描述容器狀態的函數

函數 功能 調用示例
size_type capacity() const; 返回當前存儲空間下,容器可容納的元素數目(空間由vector自行動態申請,1/2/4/8規律遞增) v1.capacity()
bool empty() const; 返回容器是否爲空 v1.empty()
size_type size() const; 返回容器中當前存儲元素的數目 v1.size()
size_type max_zise() const; 返回可以輸入容器的最大元素數目 v1.max_size()

5、綜合示例

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


void print(vector<int> &v)
{
	for(int i=0;i<v.size();i++)
		cout<<v[i]<<" ";
	cout<<endl;
}

int main()
{
	vector<int>::iterator v_i;
	vector<int>v;
	
	v.push_back(103);	cout<<"   當前容量:"<<v.capacity()<<endl;
	v.push_back(765);	cout<<"   當前容量:"<<v.capacity()<<endl;
	v.push_back(208);	cout<<"   當前容量:"<<v.capacity()<<endl;
	v.push_back(435);	cout<<"   當前容量:"<<v.capacity()<<endl;
	

	cout<<endl;
	cout<<"利用迭代器打印:"; 
	for(v_i=v.begin();v_i!=v.end();v_i++)
		cout<<*v_i<<" ";		//迭代器可以看作指針 
	cout<<endl;
	
	cout<<"利用at打印:";
	for(int i=0;i<v.size();i++)
	{
		int &nValue=v.at(i);	//注意at返回一個引用 
		cout<<nValue<<" ";			
	} 
	
	cout<<endl; 
	
	cout<<"利用下標打印:";
	for(int i=0;i<v.size();i++)
		cout<<v[i]<<" ";
	cout<<endl<<endl; 
	
	cout<<"在第一位插入100:";
	v.insert(v.begin(),100);
	print(v);
	cout<<"   當前容量:"<<v.capacity()<<endl<<endl;
	
	cout<<"在第二位插入3個200:";
	v.insert(v.begin()+1,3,200);
	print(v);
	cout<<"   當前容量:"<<v.capacity()<<endl<<endl;
	
	cout<<"在第一位插入第五到八位:";
	v.insert(v.begin(),v.begin()+4,v.begin()+7);
	print(v);
	cout<<"   當前容量:"<<v.capacity()<<endl<<endl;
	
	cout<<"刪除第一個元素:";
	v.erase(v.begin());
	print(v);	
	
	cout<<endl<<"pop一個元尾部素:"<<v.back()<<endl;
	v.pop_back(); 
	print(v);
	
	cout<<endl<<"清空元素:";
	v.clear();
	print(v);
	cout<<"   當前容量:"<<v.capacity()<<endl<<endl;

	cout<<endl<<"assign整體賦值:";
	v.assign(10,0);
	print(v); 
	cout<<"   當前容量:"<<v.capacity()<<endl<<endl;
	
	return 0;
}

三、C++11中vector新特性

  • dev-C++使用C++11特性,需要
    工具 -> 編譯選項 -> 編譯時加入以下命令(打鉤)-> 寫 “-std=c++11”

在這裏插入圖片描述

1、使用列表{}對vector進行初始化賦值

vector<int>v1={1,2,3};
vector v2{1,2,3}

2、利用for遍歷元素並進行簡單操作

  1. 引用傳遞並進行運算
for(auto &i : v1) i*=i;			//遍歷元素並進行乘方
  1. 值傳遞並進行操作
for(auto i : v1) cout<<i<<endl;	//遍歷元素並輸出 

3. 示例

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

#define print(V)	for(auto i:V) {cout<<i<<" ";} cout<<endl;	//使用新特性遍歷 & 打印元素 
 

int main()
{
	//使用新特性初始化vector向量 
	vector<int>v1={1,2,3,4};
	print(v1); 
	
	//使用新特性初始化vector向量 
	vector<int>v2{4,3,2,1};
	print(v2); 
	
	//遍歷v1做乘方
	for(auto &i : v1) i*=i;	 
	print(v1); 

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