C++ vector使用方法

2022-06-13 15:28 更新

在 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?

向量(vector)是一個封裝了動態(tài)大小數(shù)組的順序容器(Sequence Container)。跟任意其它類型容器一樣,它能夠存放各種類型的對象??梢院唵蔚恼J(rèn)為,向量是一個能夠存放任意類型的動態(tài)數(shù)組。

二、容器特性

1.順序序列

順序容器中的元素按照嚴(yán)格的線性順序排序。可以通過元素在序列中的位置訪問對應(yīng)的元素。

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

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

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

容器使用一個內(nèi)存分配器對象來動態(tài)地處理它的存儲需求。

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

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

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

2.增加函數(shù)

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

3.刪除函數(shù)

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

4.遍歷函數(shù)

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

5.判斷函數(shù)

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

6.大小函數(shù)

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

7.其他函數(shù)

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

8.看著清楚

  1. push_back 在數(shù)組的最后添加一個數(shù)據(jù)
  2. pop_back 去掉數(shù)組的最后一個數(shù)據(jù)
  3. at 得到編號位置的數(shù)據(jù)
  4. begin 得到數(shù)組頭的指針
  5. end 得到數(shù)組的最后一個單元+1的指針
  6. front 得到數(shù)組頭的引用
  7. back 得到數(shù)組的最后一個單元的引用
  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ù)項
  14. clear 清空當(dāng)前的vector
  15. rbegin 將vector反轉(zhuǎn)后的開始指針返回(其實就是原來的end-1)
  16. rend 將vector反轉(zhuǎn)構(gòu)的結(jié)束指針返回(其實就是原來的begin-1)
  17. empty 判斷vector是否為空
  18. swap 與另一個vector交換數(shù)據(jù)

四、基本用法

#include < vector> 
using namespace std;

五、簡單介紹

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


六、vector使用實例

使用vector注意事項:

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

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

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

 其中的“&”絕對不能少!?。?/p>

vector對象的定義和初始化

同樣的,使用前,導(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對象動態(tài)增長:

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;  
}  



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

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號