在 C++ 中,vector 是一個十分有用的容器。它能夠像容器一樣存放各種類型的對象,簡單地說,vector是一個能夠存放任意類型的動態(tài)數(shù)組,能夠增加和壓縮數(shù)據(jù)。
C++ 中數(shù)組很坑,有沒有類似 Python 中 list 的數(shù)據(jù)類型呢?類似的就是 vector!vector 是同一種類型的對象的集合,每個對象都有一個對應(yīng)的整數(shù)索引值。和 string 對象一樣,標(biāo)準(zhǔn)庫將負(fù)責(zé)管理與存儲元素相關(guān)的內(nèi)存。我們把 vector 稱為容器,是因為它可以包含其他對象。一個容器中的所有對象都必須是同一種類型的。
向量(vector)是一個封裝了動態(tài)大小數(shù)組的順序容器(Sequence Container)。跟任意其它類型容器一樣,它能夠存放各種類型的對象??梢院唵蔚恼J(rèn)為,向量是一個能夠存放任意類型的動態(tài)數(shù)組。
順序容器中的元素按照嚴(yán)格的線性順序排序。可以通過元素在序列中的位置訪問對應(yīng)的元素。
支持對序列中的任意元素進行快速直接訪問,甚至可以通過指針?biāo)闶鲞M行該操作。操供了在序列末尾相對快速地添加/刪除元素的操作。
容器使用一個內(nèi)存分配器對象來動態(tài)地處理它的存儲需求。
vector()
?:創(chuàng)建一個空vectorvector(int nSize)
?:創(chuàng)建一個vector,元素個數(shù)為nSizevector(int nSize,const t& t)
?:創(chuàng)建一個vector,元素個數(shù)為nSize,且值均為tvector(const vector&)
?:復(fù)制構(gòu)造函數(shù)vector(begin,end)
?:復(fù)制[begin,end)區(qū)間內(nèi)另一個數(shù)組的元素到vector中void push_back(const T& x)
?:向量尾部增加一個元素Xiterator insert(iterator it,const T& x)
?:向量中迭代器指向元素前增加一個元素xiterator insert(iterator it,int n,const T& x)
?:向量中迭代器指向元素前增加n個相同的元素xiterator insert(iterator it,const_iterator first,const_iterator last)
?:向量中迭代器指向元素前插入另一個相同類型向量的[first,last)間的數(shù)據(jù)iterator erase(iterator it)
?:刪除向量中迭代器指向元素iterator erase(iterator first,iterator last)
?:刪除向量中[first,last)中元素void pop_back()
?:刪除向量中最后一個元素void clear()
?:清空向量中所有元素reference at(int pos)
?:返回pos位置元素的引用reference front()
?:返回首元素的引用reference back()
?:返回尾元素的引用iterator begin()
?:返回向量頭指針,指向第一個元素iterator end()
?:返回向量尾指針,指向向量最后一個元素的下一個位置reverse_iterator rbegin()
?:反向迭代器,指向最后一個元素reverse_iterator rend()
?:反向迭代器,指向第一個元素之前的位置bool empty() const
?:判斷向量是否為空,若為空,則向量中無元素int size() const
?:返回向量中元素的個數(shù)int capacity() const
?:返回當(dāng)前向量所能容納的最大元素值int max_size() const
?:返回最大可允許的 vector 元素數(shù)量值void swap(vector&)
?:交換兩個同類型向量的數(shù)據(jù)void assign(int n,const T& x)
?:設(shè)置向量中前n個元素的值為xvoid assign(const_iterator first,const_iterator last)
?:向量中[first,last)中元素設(shè)置成當(dāng)前向量元素#include < vector>
using namespace std;
使用vector注意事項:
1、如果你要表示的向量長度較長(需要為向量內(nèi)部保存很多數(shù)),容易導(dǎo)致內(nèi)存泄漏,而且效率會很低;
2、vector 作為函數(shù)的參數(shù)或者返回值時,需要注意它的寫法:
double Distance(vector<int>&a, vector<int>&b)
其中的“&”絕對不能少!?。?/p>
同樣的,使用前,導(dǎo)入頭文件 #include 可以使用using聲明:using std::vector;vector 是一個類模板(class template)。使用模板可以編寫一個類定義或函數(shù)定義,而用于多個不同的數(shù)據(jù)類型。因此,我們可以定義保存 string 對象的 vector,或保存 int 值的 vector,又或是保存自定義的類類型對象(如 Sales_items 對象)的 vector。
聲明從類模板產(chǎn)生的某種類型的對象,需要提供附加信息,信息的種類取決于模板。以 vector 為例,必須說明 vector 保存何種對象的類型,通過將類型放在類型放在類模板名稱后面的尖括號中來指定類型:
vector<T> v1; | 保存類型為 T 對象。默認(rèn)構(gòu)造函數(shù) v1 為空。 |
vector<T> v2(v1); | v2 是 v1 的一個副本。 |
vector<T> v3(n, i); | v3 包含 n 個值為 i 的元素。 |
vector<T> v4(n); | v4 含有值初始化的元素的 n 個副本。 |
【注意:1、若要創(chuàng)建非空的 vector 對象,必須給出初始化元素的值;2、當(dāng)把一個 vector 對象復(fù)制到另一個 vector 對象時,新復(fù)制的 vector 中每一個元素都初始化為原 vectors 中相應(yīng)元素的副本。但這兩個 vector 對象必須保存同一種元素類型;3、可以用元素個數(shù)和元素值對 vector 對象進行初始化。構(gòu)造函數(shù)用元素個數(shù)來決定 vector 對象保存元素的
個數(shù),元素值指定每個元素的初始值】
vector 對象(以及其他標(biāo)準(zhǔn)庫容器對象)的重要屬性就在于可以在運行時高效地添加元素。
注意:因為 vector 增長的效率高,在元素值已知的情況下,最好是動態(tài)地添加元素。
實例:
vector<int>test;//建立一個vector,int為數(shù)組元素的數(shù)據(jù)類型,test為動態(tài)數(shù)組名
簡單的使用方法如下:
vector<int>test;//建立一個vector
test.push_back(1);
test.push_back(2);//把1和2壓入vector,這樣test[0]就是1,test[1]就是2
實例:
vector<vector<Point2f> > points; //定義一個二維數(shù)組
points[0].size(); //指第一行的列數(shù)
1 、基本操作
(1)頭文件?#include<vector>
?.
(2)創(chuàng)建vector對象,?vector<int> vec
?;
(3)尾部插入數(shù)字:?vec.push_back(a)
?;
(4)使用下標(biāo)訪問元素,?cout<<vec[0]<<endl
?;記住下標(biāo)是從0開始的。
(5)使用迭代器訪問元素.
vector<int>::iterator it;
for(it=vec.begin();it!=vec.end();it++)
cout<<*it<<endl;
(6)插入元素:?vec.insert(vec.begin()+i,a)
?; 在第i+1個元素前面插入a;
(7)刪除元素:?vec.erase(vec.begin()+2)
? ; 刪除第3個元素
?vec.erase(vec.begin()+i,vec.end()+j)
?; 刪除區(qū)間[ i,j-1] 區(qū)間從0開始
(8)向量大小: ?vec.size()
?;
(9)清空: ?vec.clear()
?;
特別提示:這里有 begin() 與 end() 函數(shù)、front() 與 back() 的差別
2、重要說明
vector 的元素不僅僅可以是 int,double,string 還可以是結(jié)構(gòu)體,但是要注意:結(jié)構(gòu)體要定義為全局的,否則會出錯。
#include<stdio.h>
#include<algorithm>
#include<vector>
#include<iostream>
using namespace std;
typedef struct rect
{
int id;
int length;
int width;
//對于向量元素是結(jié)構(gòu)體的,可在結(jié)構(gòu)體內(nèi)部定義比較函數(shù),下面按照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;
}
3、算法
(1) 使用reverse將元素翻轉(zhuǎn):需要頭文件 #include<algorithm>
reverse(vec.begin(),vec.end());將元素翻轉(zhuǎn),即逆序排列!
(在vecto r中,如果一個函數(shù)中需要兩個迭代器,一般后一個都不包含)
(2)使用 sort 排序:需要頭文件 #include<algorithm>,
sort(vec.begin(),vec.end());(默認(rèn)是按升序排列,即從小到大).
可以通過重寫排序比較函數(shù)按照降序比較,如下:
定義排序比較函數(shù):
bool Comp(const int &a,const int &b)
{
return a>b;
}
調(diào)用時: sort(vec.begin(),vec.end(),Comp),這樣就降序排序。
輸出vector的中的元素
vector<float> vecClass;
int nSize = vecClass.size();
//打印 vecClass,方法一:
for(int i=0;i<nSize;i++)
{
cout<<vecClass[i]<<" ";
}
cout<<endl;
需要注意的是:以方法一進行輸出時,數(shù)組的下表必須保證是整數(shù)。
//打印 vecClass,方法二:
for(int i=0;i<nSize;i++)
{
cout<<vecClass.at(i)<<" ";
}
cout<<endl;
//打印 vecClass,方法三:輸出某一指定的數(shù)值時不方便
for(vector<float>::iterator it = vecClass.begin();it!=vecClass.end();it++)
{
cout<<*it<<" ";
}
cout<<endl;
二維數(shù)組的使用:
#include "stdafx.h"
#include <cv.h>
#include <vector>
#include <iostream>
using namespace std;
int main()
{
using namespace std;
int out[3][2] = { 1, 2,
3, 4,
5, 6 };
vector <int*> v1;
v1.push_back(out[0]);
v1.push_back(out[1]);
v1.push_back(out[2]);
cout << v1[0][0] << endl;//1
cout << v1[0][1] << endl;//2
cout << v1[1][0] << endl;//3
cout << v1[1][1] << endl;//4
cout << v1[2][0] << endl;//5
cout << v1[2][1] << endl;//6
return 0;
}
更多建議: