一、引入
引入:略
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語言中,都是靜態陣列,即需要在定義的時候就定下該陣列的長度,然而這在實際的應用中,很大的一部分情況是我們並不知道...