C++ vector使用方法

2022-06-13 15:28 更新

在 C++ 中,vector 是一個(gè)十分有用的容器。它能夠像容器一樣存放各種類型的對(duì)象,簡(jiǎn)單地說(shuō),vector是一個(gè)能夠存放任意類型的動(dòng)態(tài)數(shù)組,能夠增加和壓縮數(shù)據(jù)。

C++ 中數(shù)組很坑,有沒(méi)有類似 Python 中 list 的數(shù)據(jù)類型呢?類似的就是 vector!vector 是同一種類型的對(duì)象的集合,每個(gè)對(duì)象都有一個(gè)對(duì)應(yīng)的整數(shù)索引值。和 string 對(duì)象一樣,標(biāo)準(zhǔn)庫(kù)將負(fù)責(zé)管理與存儲(chǔ)元素相關(guān)的內(nèi)存。我們把 vector 稱為容器,是因?yàn)樗梢园渌麑?duì)象。一個(gè)容器中的所有對(duì)象都必須是同一種類型的。

一、什么是vector?

向量(vector)是一個(gè)封裝了動(dòng)態(tài)大小數(shù)組的順序容器(Sequence Container)。跟任意其它類型容器一樣,它能夠存放各種類型的對(duì)象??梢院?jiǎn)單的認(rèn)為,向量是一個(gè)能夠存放任意類型的動(dòng)態(tài)數(shù)組。

二、容器特性

1.順序序列

順序容器中的元素按照嚴(yán)格的線性順序排序??梢酝ㄟ^(guò)元素在序列中的位置訪問(wèn)對(duì)應(yīng)的元素。

2.動(dòng)態(tài)數(shù)組

支持對(duì)序列中的任意元素進(jìn)行快速直接訪問(wèn),甚至可以通過(guò)指針?biāo)闶鲞M(jìn)行該操作。操供了在序列末尾相對(duì)快速地添加/刪除元素的操作。

3.能夠感知內(nèi)存分配器的(Allocator-aware)

容器使用一個(gè)內(nèi)存分配器對(duì)象來(lái)動(dòng)態(tài)地處理它的存儲(chǔ)需求。

三、基本函數(shù)實(shí)現(xiàn)

1.構(gòu)造函數(shù)

  • ?vector()?:創(chuàng)建一個(gè)空vector
  • ?vector(int nSize)?:創(chuàng)建一個(gè)vector,元素個(gè)數(shù)為nSize
  • ?vector(int nSize,const t& t)?:創(chuàng)建一個(gè)vector,元素個(gè)數(shù)為nSize,且值均為t
  • ?vector(const vector&)?:復(fù)制構(gòu)造函數(shù)
  • ?vector(begin,end)?:復(fù)制[begin,end)區(qū)間內(nèi)另一個(gè)數(shù)組的元素到vector中

2.增加函數(shù)

  • ?void push_back(const T& x)?:向量尾部增加一個(gè)元素X
  • ?iterator insert(iterator it,const T& x)?:向量中迭代器指向元素前增加一個(gè)元素x
  • ?iterator insert(iterator it,int n,const T& x)?:向量中迭代器指向元素前增加n個(gè)相同的元素x
  • ?iterator insert(iterator it,const_iterator first,const_iterator last)?:向量中迭代器指向元素前插入另一個(gè)相同類型向量的[first,last)間的數(shù)據(jù)

3.刪除函數(shù)

  • ?iterator erase(iterator it)?:刪除向量中迭代器指向元素
  • ?iterator erase(iterator first,iterator last)?:刪除向量中[first,last)中元素
  • ?void pop_back()?:刪除向量中最后一個(gè)元素
  • ?void clear()?:清空向量中所有元素

4.遍歷函數(shù)

  • ?reference at(int pos)?:返回pos位置元素的引用
  • ?reference front()?:返回首元素的引用
  • ?reference back()?:返回尾元素的引用
  • ?iterator begin()?:返回向量頭指針,指向第一個(gè)元素
  • ?iterator end()?:返回向量尾指針,指向向量最后一個(gè)元素的下一個(gè)位置
  • ?reverse_iterator rbegin()?:反向迭代器,指向最后一個(gè)元素
  • ?reverse_iterator rend()?:反向迭代器,指向第一個(gè)元素之前的位置

5.判斷函數(shù)

  • ?bool empty() const?:判斷向量是否為空,若為空,則向量中無(wú)元素

6.大小函數(shù)

  • ?int size() const?:返回向量中元素的個(gè)數(shù)
  • ?int capacity() const?:返回當(dāng)前向量所能容納的最大元素值
  • ?int max_size() const?:返回最大可允許的 vector 元素?cái)?shù)量值

7.其他函數(shù)

  • ?void swap(vector&)?:交換兩個(gè)同類型向量的數(shù)據(jù)
  • ?void assign(int n,const T& x)?:設(shè)置向量中前n個(gè)元素的值為x
  • ?void assign(const_iterator first,const_iterator last)?:向量中[first,last)中元素設(shè)置成當(dāng)前向量元素

8.看著清楚

  1. push_back 在數(shù)組的最后添加一個(gè)數(shù)據(jù)
  2. pop_back 去掉數(shù)組的最后一個(gè)數(shù)據(jù)
  3. at 得到編號(hào)位置的數(shù)據(jù)
  4. begin 得到數(shù)組頭的指針
  5. end 得到數(shù)組的最后一個(gè)單元+1的指針
  6. front 得到數(shù)組頭的引用
  7. back 得到數(shù)組的最后一個(gè)單元的引用
  8. max_size 得到vector最大可以是多大
  9. capacity 當(dāng)前vector分配的大小
  10. size 當(dāng)前使用數(shù)據(jù)的大小
  11. resize 改變當(dāng)前使用數(shù)據(jù)的大小,如果它比當(dāng)前使用的大,者填充默認(rèn)值
  12. reserve 改變當(dāng)前vecotr所分配空間的大小
  13. erase 刪除指針指向的數(shù)據(jù)項(xiàng)
  14. clear 清空當(dāng)前的vector
  15. rbegin 將vector反轉(zhuǎn)后的開始指針?lè)祷?其實(shí)就是原來(lái)的end-1)
  16. rend 將vector反轉(zhuǎn)構(gòu)的結(jié)束指針?lè)祷?其實(shí)就是原來(lái)的begin-1)
  17. empty 判斷vector是否為空
  18. swap 與另一個(gè)vector交換數(shù)據(jù)

四、基本用法

#include < vector> 
using namespace std;

五、簡(jiǎn)單介紹

  1. vector<類型>標(biāo)識(shí)符
  2. vector<類型>標(biāo)識(shí)符(最大容量)
  3. vector<類型>標(biāo)識(shí)符(最大容量,初始所有值)
  4. Int i[5]={1,2,3,4,5}vector<類型>vi(I,i+2);//得到i索引值為3以后的值
  5. vector< vector< int> >v; 二維向量//這里最外的<>要有空格。否則在比較舊的編譯器下無(wú)法通過(guò)


六、vector使用實(shí)例

使用vector注意事項(xiàng):

1、如果你要表示的向量長(zhǎng)度較長(zhǎng)(需要為向量?jī)?nèi)部保存很多數(shù)),容易導(dǎo)致內(nèi)存泄漏,而且效率會(huì)很低;

2、vector 作為函數(shù)的參數(shù)或者返回值時(shí),需要注意它的寫法:

double Distance(vector<int>&a, vector<int>&b)

 其中的“&”絕對(duì)不能少?。?!

vector對(duì)象的定義和初始化

同樣的,使用前,導(dǎo)入頭文件 #include 可以使用using聲明:using std::vector;vector 是一個(gè)類模板(class template)。使用模板可以編寫一個(gè)類定義或函數(shù)定義,而用于多個(gè)不同的數(shù)據(jù)類型。因此,我們可以定義保存 string 對(duì)象的 vector,或保存 int 值的 vector,又或是保存自定義的類類型對(duì)象(如 Sales_items 對(duì)象)的 vector。
聲明從類模板產(chǎn)生的某種類型的對(duì)象,需要提供附加信息,信息的種類取決于模板。以 vector 為例,必須說(shuō)明 vector 保存何種對(duì)象的類型,通過(guò)將類型放在類型放在類模板名稱后面的尖括號(hào)中來(lái)指定類型:

vector<T> v1; 保存類型為 T 對(duì)象。默認(rèn)構(gòu)造函數(shù) v1 為空。
vector<T> v2(v1);  v2 是 v1 的一個(gè)副本。
vector<T> v3(n, i); v3 包含 n 個(gè)值為 i 的元素。
vector<T> v4(n);  v4 含有值初始化的元素的 n 個(gè)副本。

【注意:1、若要?jiǎng)?chuàng)建非空的 vector 對(duì)象,必須給出初始化元素的值;2、當(dāng)把一個(gè) vector 對(duì)象復(fù)制到另一個(gè) vector 對(duì)象時(shí),新復(fù)制的 vector 中每一個(gè)元素都初始化為原 vectors 中相應(yīng)元素的副本。但這兩個(gè) vector 對(duì)象必須保存同一種元素類型;3、可以用元素個(gè)數(shù)和元素值對(duì) vector 對(duì)象進(jìn)行初始化。構(gòu)造函數(shù)用元素個(gè)數(shù)來(lái)決定 vector 對(duì)象保存元素的
個(gè)數(shù),元素值指定每個(gè)元素的初始值】

vector對(duì)象動(dòng)態(tài)增長(zhǎng):

vector 對(duì)象(以及其他標(biāo)準(zhǔn)庫(kù)容器對(duì)象)的重要屬性就在于可以在運(yùn)行時(shí)高效地添加元素。

注意:因?yàn)?nbsp;vector 增長(zhǎng)的效率高,在元素值已知的情況下,最好是動(dòng)態(tài)地添加元素。

實(shí)例:

vector<int>test;//建立一個(gè)vector,int為數(shù)組元素的數(shù)據(jù)類型,test為動(dòng)態(tài)數(shù)組名

簡(jiǎn)單的使用方法如下:

vector<int>test;//建立一個(gè)vector
test.push_back(1);
test.push_back(2);//把1和2壓入vector,這樣test[0]就是1,test[1]就是2

實(shí)例:

vector<vector<Point2f> > points; //定義一個(gè)二維數(shù)組
points[0].size();  //指第一行的列數(shù)


1 、基本操作

(1)頭文件?#include<vector>?.

(2)創(chuàng)建vector對(duì)象,?vector<int> vec?;

(3)尾部插入數(shù)字:?vec.push_back(a)?;

(4)使用下標(biāo)訪問(wèn)元素,?cout<<vec[0]<<endl?;記住下標(biāo)是從0開始的。

(5)使用迭代器訪問(wèn)元素.

vector<int>::iterator it;
for(it=vec.begin();it!=vec.end();it++)
    cout<<*it<<endl;

(6)插入元素:?vec.insert(vec.begin()+i,a)?; 在第i+1個(gè)元素前面插入a;

(7)刪除元素:?vec.erase(vec.begin()+2)? ; 刪除第3個(gè)元素

?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、重要說(shuō)明

vector 的元素不僅僅可以是 int,double,string 還可以是結(jié)構(gòu)體,但是要注意:結(jié)構(gòu)體要定義為全局的,否則會(huì)出錯(cuò)。

#include<stdio.h>  
#include<algorithm>  
#include<vector>  
#include<iostream>  
using namespace std;  
typedef struct rect  
{  
    int id;  
    int length;  
    int width;  
  //對(duì)于向量元素是結(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中,如果一個(gè)函數(shù)中需要兩個(gè)迭代器,一般后一個(gè)都不包含)

(2)使用 sort 排序:需要頭文件 #include<algorithm>,

sort(vec.begin(),vec.end());(默認(rèn)是按升序排列,即從小到大).

可以通過(guò)重寫排序比較函數(shù)按照降序比較,如下:

定義排序比較函數(shù):

bool Comp(const int &a,const int &b)
{
    return a>b;
}

調(diào)用時(shí): 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;   

需要注意的是:以方法一進(jìn)行輸出時(shí),數(shù)組的下表必須保證是整數(shù)。

 //打印 vecClass,方法二:     

for(int i=0;i<nSize;i++)    
{    
   cout<<vecClass.at(i)<<"     ";    
}    
   cout<<endl;    

//打印 vecClass,方法三:輸出某一指定的數(shù)值時(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;  
}  



以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)