原創 C 動態陣列 vector 詳解

2021-07-30 06:21:29 字數 4428 閱讀 3649

一、引入

引入:略

vector收錄在stl裡,是一種特殊的資料結構。它的中文名字叫做「動態陣列」或者「不定長陣列」,有時也被翻譯成「容器」。

說白了,vector就是乙個功能強大的陣列。下面讓我們來體驗它強大的功能吧!

二、vector的標頭檔案

vector收錄在std庫里,所以呼叫vector需要

#include

using namespace std;

這兩個標頭檔案。

三、vector的宣告與建構函式

既然是「動態陣列」,vector是乙個什麼陣列呢,int?double?或者結構體陣列?

我們可以這樣宣告乙個vector:

vector 《資料型別》 動態陣列名;

比如:vector i;//乙個int的動態陣列

vector c;//乙個char的動態陣列

vector n;//乙個node的動態陣列(node是結構體名)

如果你想賦初值,你可以:

vector m(a,b);//在m裡裝a個b

vector n(a); //在n裡裝a個0

當然你也可以:

vector a;

vector b(a);//乙個和a一模一樣的動態陣列

vector c(b.begin()+l,b.end()-r);//繼承b動態陣列下標[l,b.end()-r)的值,注意,下標從0開始,begin(),end(),size()三個函式見下文

四、vector的析構函式

很簡單,你可以vector b;//a是某種資料結構,b是動態陣列名

如果你想析構它,只需呼叫b.~vector(); 即可。

也就是說,vector的析構函式是:動態陣列名.~vector《該陣列的資料結構》();

五、vector的基本操作

以vector v為例:

① v[i]或v.at(i)//返回v[i]的值

② v.size();//返回v陣列元素總個數

③ v.front();//返回v陣列第乙個元素的值

④ v.back();//返回v陣列最後乙個元素的值

⑤ v.clear();//清空v陣列

⑥ v.begin();//返回v陣列第乙個數的位址

⑦ v.end();//返回v陣列最後乙個數之後的位址

⑧ v.empty();//判斷v陣列是否為空,是空則返回1(true),非空(有元素)則返回0(false)

⑨ v.swap(v1);//v1是另乙個動態陣列,將v和v1元素互換

⑩ swap(v,v1);//同⑨

注意:再次重申,vector的下標是從0開始的!

注意:除v[i]外,其餘都是vector的自帶函式,因此必須添上括號!

五、vector的插入

std庫提供了好幾種插入,這裡講最為常用的三種。

① v.push_back(a);//在v陣列的尾部插入數a

比如:有乙個動態陣列x:2017 2333

呼叫x.push_back(666);

則x:2017 2333 666

② v.insert(v.begin()+k,a);//在下標k的前面插入數a,k之後的數依次後退一位

//記住,下標是從0開始的!

比如:動態陣列x:1 2 3 4 5 6 

呼叫x.insert(x.begin()+2,100);

則x:1 2 100 3 4 5 6 

③ x.insert(x.begin()+k,p,a);//在下標k前面插入p個a

六、vector的刪除

也有三種,

① v.pop_back()//刪除最後乙個元素

② v.erase(v.begin()+k);//刪除下標為k的數,返回下乙個位置的下標

③ v.erase(v.begin()+l,v.end()-r);//刪除下標[l,v.end()-r)的元素

七、vector的記憶體機制

vector能裝多少個元素呢?它的長度是多長呢?接下來就要簡單地介紹一下vector的記憶體機制。

先介紹幾個函式吧:

v.capacity();//返回v陣列的長度,就相當於int v[20000];的20000

v.resize(k);//將v陣列的長度設為k

現在讓我們來研究一下vector的記憶體機制。

#include#include#includeusing namespace std;

const unsigned int maxn=2147483647;

vector v;

int main()

}}

這個驗證程式測試了vector的長度上限,現在讓我們來看看輸出結果:

(也就是說,我們把vector玩爆了。)

我們來看看它的規律,我們可以發現,每一次,它的記憶體都翻了一倍!!

我們再來看看它什麼時候翻倍。

在printf("%d\n",a);時,再輸出此時的v.size();

此時的程式:

#include#include#includeusing namespace std;

const unsigned int maxn=2147483647;

vector v;

int main()

}}

此時的輸出結果:

(結尾還是那句英文。。。。)

我們可以看到:

設當前v.capacity()=c,v.size()=s;如果s=c+1,那麼c就會加倍。

這是乙個初始長度為0的動態陣列,接著我們來看看初始長度不為0的情況。

此時**:

#include#include#includeusing namespace std;

const unsigned int maxn=2147483647;

const unsigned int beg=1250;//這是可修改的

vector v;

int main()

}}

結果(只保留了一部分):

at first , capacity() = 1000

size()=1001 -> capacity()=2000

size()=2001 -> capacity()=4000

size()=4001 -> capacity()=8000

size()=8001 -> capacity()=16000

at first , capacity() = 5000

size()=5001 -> capacity()=10000

size()=10001 -> capacity()=20000

size()=20001 -> capacity()=40000

size()=40001 -> capacity()=80000

size()=80001 -> capacity()=160000

at first , capacity() = 2333

size()=2334 -> capacity()=4666

size()=4667 -> capacity()=9332

size()=9333 -> capacity()=18664

size()=18665 -> capacity()=37328

size()=37329 -> capacity()=74656

size()=74657 -> capacity()=149312

size()=149313 -> capacity()=298624

size()=298625 -> capacity()=597248

多次試驗後,我們可以得出結論:

當動態陣列內的元素比動態陣列長度多一時,動態陣列長度翻倍!

也就是說:if(v.size()-1==v.capacity()) v.resize(v.capacity()*2);

而長度翻倍是很花時間的。所以說做題的時候,記得事先把vector的長度拉得足夠長,以免執行的時候,vector長度翻倍浪費時間。

最後乙個問題,vector最多能裝多少個元素呢?

我們可以用函式:

v.max_size();

來得到。

下列是乙個常用的資料結構對應的max_size();

STL之vector動態陣列(詳解)

vector收錄在stl裡,是一種特殊的資料結構。它的中文名字叫做 動態陣列 或者 不定長陣列 有時也被翻譯成 容器 基本操作 1 構造乙個vector vectorvec。其中t是我們陣列要儲存的資料型別,可以是int float double等。初始的時候vec是空的 2 通過push back...

C 中vector動態陣列

目錄 0.寫在前面 1.基本操作 2.需求實現 2.1 reverse翻轉vector中元素 2.2 使用sort排序 2.3 列印vector的方式 2.4 構造乙個陣列,並且封裝為vector 3.vector作為引數的三種傳參方式 傳值 傳引用 傳指標 4.vector中begin end f...

C 動態陣列vector實現

最近在做將matlab 轉化為c c 的工作,在實際應用時,發現動態陣列非常重要,我在學習的時候也踩了許多坑,這篇就當做一篇踩坑筆記,希望讀者能夠繞開我踩過的坑,順利應用動態陣列。其實在c語言中,都是靜態陣列,即需要在定義的時候就定下該陣列的長度,然而這在實際的應用中,很大的一部分情況是我們並不知道...