vector(向量)是一種對象實體,能夠容納許多其他類型相同的元素, 因此又被稱為容器。
與string相同,vector同屬於STL(Standard Template Library, 標准模板庫)中的一種自定義的數據類型,可以廣義上認為是數組的增強版。
在使用它時, 需要包含頭文件 vector
#include <vector>
vector 容器與數組相比其優點在於它能夠根據需要隨時自動調整自身的大小以便容下所要放入的元素。此外,vector也提供了許多的方法來對自身進行操作。
vector<int> a; //聲明一個int型向量a vector<int> a(10); //聲明一個初始大小為10的向量 vector<int> a(10, 1); //聲明一個初始大小為10且初始值都為1的向量 vector<int> b(a); //聲明並用向量a初始化向量b vector<int> b(a.begin(), a.begin()+3); //將a向量中從第0個到第2個(共3個)作為向量b的初始值
除此之外, 還可以直接使用數組來初始化向量:
int n[] = {1, 2, 3, 4, 5};
vector<int> a(n, n+5); //將數組n的前5個元素作為向量a的初值
vector<int> a(&n[1], &n[4]); //將n[1]-n[4]范圍內的元素作為向量a的初值
-> 使用下表訪問元素
元素的輸入和訪問可以像操作普通的數組那樣
輸入:
cin>>a[n];
輸出:
cout<<a[n];
示例:
#include <iostream>
#include <vector>
using namespace std;
int main()
{
vector<int> a(10, 0);//大小為10初值為0的向量a
//對其中部分元素進行輸入
cin >> a[2];
cin >> a[5];
cin >> a[6];
//全部輸出
int i ;
for(i=0; i<a.size(); i++)
cout << a[i] << " ";
return 0 ;
}
-> 使用迭代器訪問元素
在上例中,將元素全部輸出部分的代碼可以改寫為:
//全部輸出
vector<int>::interator t;
for(t = a.begin(); t != a.end(); t++)
cout<< *t << " ";
*t為指針的間接訪問形式,意思是訪問t所指向的元素值。
1> a.size() //獲取向量中的元素個數
2> a.empty() //判斷向量是否為空
3> a.clear() //清空向量中的元素
4> a = b ; //將b向量復制到a向量中
5> 比較 - 保持 ==、!=、>、>=、<、<= 的慣有含義。
6> 插入 - insert
① a.insert(a.begin(), 1000);
//將1000插入到向量a的起始位置前
② a.insert(a.begin(), 3, 1000); //將1000分別插入到向量元素位置的0-2處(共3個元素)
③ vector<int> a(5, 1);
vector<int> b(10);
b.insert(b.begin(), a.begin(), a.end()); //將a.begin(),a.end()之間的全部元素插入到b.begin()前
7> 刪除 - erase
① b.erase(vec.begin()+2); //刪除第3個元素
② vec.erase(vec.begin()+i,vec.end()+j); //刪除區間[i,j-1]
8> 交換 - swap
b.swap(a) ; //a向量與b向量進行交換
與數組相同,向量也可以增加維數,例如聲明一個m*n大小的二維向量方式可以像如下形式:
vector< vector<int> > b(10, vector<int>(5)); //創建一個10*5的int型二維向量
在這裡,實際上創建的是一個向量中元素為向量的向量。同樣可以根據一維向量的相關特性對二維向量進行操作。
例:
#include <iostream>
#include <vector>
using namespace std ;
int main()
{
vector< vector<int> > b(10, vector<int>(5, 0)) ;
//對部分數據進行輸入
cin>>b[1][1];
cin>>b[2][2];
cin>>b[3][3];
//全部輸出
int m, n;
for(m=0; m<b.size(); m++) //b.size()獲取行向量的大小
{
for(n=0; n<b[m].size(); n++) //獲取向量中具體每個向量的大小
cout<<b[m][n]<<" " ;
cout<<"\n" ;
}
return 0;
}
Vector的元素不僅僅可以是int,double,string,還可以是結構體,但是要注意:結構體要定義為全局的,否則會出錯。 下面是一段簡短的程序代碼:
#include <stdio.h>
#include <algorithm>
#include <vector>
#include <iostream>
using namespace std;
typedef struct rect
{
int id;
int length;
int width;
//對於向量元素是結構體的,可在結構體內部定義比較函數,下面按照id,length,width升序排序。
bool operator< (const rect &a) const
{
if(id!=a.id)
return id<a.id;
else
{
if(length!=a.length)
return length<a.length;
else
return width<a.width;
}
}
}Rect;
int main()
{
vector<Rect> vec;
Rect rect;
rect.id=1;
rect.length=2;
rect.width=3;
vec.push_back(rect);
vector<Rect>::iterator it=vec.begin();
cout << (*it).id << ' ' << (*it).length << ' ' << (*it).width << endl;
return 0;
}
1、 使用reverse將元素翻轉:
需要頭文件#include
reverse(vec.begin(),vec.end()); //將元素翻轉
2、使用sort排序:
需要頭文件#include
sort(vec.begin(),vec.end()); //默認是按升序排列,即從小到大
可以通過重寫排序比較函數按照降序排序,如下:
定義排序比較函數:
bool Comp(const int &a,const int &b)
{
return a>b;
}
調用時:
sort(vec.begin(),vec.end(),Comp) //降序排序。