vector是不定長陣列,也就是說它的長度是不固定的,簡單地說就是「按需分配」。這聽上去似乎有點麻煩,但在宣告陣列時如果我們並不清楚陣列的長度,並且簡單粗暴地使用#define maxn 1000000
會導致記憶體失去了夢想——就算不,仍有大量的記憶體成了鹹魚。這個時候,我們就需要vector陣列。
先看一道例題:
從左到右有n個木塊,編號為0~n-1,要求模擬以下四種操作:
遇到quit時終止一組資料。a和b在同一堆的指令時非法指令,應當忽略。
所有操作結束後,輸出每個位置的木塊列表,按照從底部到頂部的順序排列。
(出自uva 101,小紫書p110)
由於每個木塊堆的最大高度並沒有限制,如果開乙個a[n][n]的陣列,顯然浪費了很多空間,並且出題人很可能會故意卡mle,於是我們需要乙個「按需分配」陣列。
在介紹vector前,先提一下鍊錶。
在c語言中,我們並沒有c++豐富的stl,也就是說需要人工實現不定長陣列:
struct node
;
這段**宣告了乙個結構體node,它包含了乙個int型變數num和乙個指標next,讓我們有請靈魂畫師來幫助我們理解。
我們的鍊錶是由若干個這樣的「小塊」組成的,由於建立的「小塊」之間沒有任何聯絡,所以我們需要用乙個指標next將它們連線到一起,也就是用next指向下乙個「小塊」,這樣我們就能將它們「鏈」在一起。
由於我們只用在需要的時候申請乙個新的塊,並把它和之前的鍊錶連在一起,所以可以達到不定長陣列的作用。
但顯然,構造乙個鍊錶十分麻煩,並且鄙人已經基本忘了怎麼寫鍊錶,所以我們需要乙個c艹。(c語言的鍊錶構建我會在之後補上(flag++))
在c++中,我們可以用vector來代替鍊錶,這需要
#include
在vector中,我們(暫時)不需要再思考指標和它的小夥伴們,可以把vector看作乙個正常的陣列:
也就是說它的空間是「連續」的。
我們可以用
vector
v;
宣告乙個vector陣列,它的元素為int型。當然,你也可以換成double型或者string型甚至是結構體。
vector為我們提供了以下操作:
v.push_back(n); //將元素n加入到v的尾部
v.pop_back(); //將v的末端的元素刪除
v.empty(); //判斷陣列是否為空,若為空則返回真,否則返回假
v.size(); //返回v中元素的數量
v.resize(n); //將v的長度設為n
如果我們想訪問v中的元素,只需要像陣列一樣訪問下標即可:
ans=v[i];
num=v[i]+v[i+1];
這時候,我們可以解決前面的例題了。
#include
#include
#include
using
namespace
std;
const
int maxn=10000;
vector
v[maxn];
int n;
int find(int a,int& p,int& h) //尋找木塊a(或b)所在位置和高度
}void clear(int p,int h) //將位置p高度h的木塊上方的所有木塊歸位
v[p].resize(h+1);
}void move(int p1,h1,p2) //將位置p1高度h1的木塊及上方的所有木塊移到位置p2的頂端
v[p1].resize(h1);
}int main()
while(s1!="quit")
cin>>s1;
}for(int i=0;i//一組資料結束,列印木塊列表
鄙人用v[i][0]來儲存木塊i所在的位置(初始為i),這樣在每次find的時候可以減少一次for迴圈查詢木塊i的位置,避免最壞情況下find為o(n²)而導致超時。
還記得之前說的「我們(暫時)不需要再思考指標和它的小夥伴們」麼?
是的,我們只是暫時不需要,但事實上還有個叫做「迭代器」的設定。
由於不(wo)可(jiu)抗(shi)力(lan)的因素,此部分之後再更新……
ps:
寫這篇的時候臨近國慶,於是我咕了將近半個月,雖然打算國慶結束後就補完迭代器的部分,然而我很快就發燒在床上癱了兩天…就這麼先扔上來吧(強顏歡笑)
…什麼?還有鍊錶?
資料結構之vector
vector是c 中的一種序列式容器,依靠其下標索引來訪問獲取容器內容。vector和array同為序列式容器,其資料格式 操作等方面都十分相似,其最大不同點在於它們對於記憶體空間的使用。array是靜態陣列,使用者必須把握好其資料數量,一次性分配合理的記憶體空間。否則array會在新增新元素而空間...
資料結構 向量 vector 陣列
從今天我的資料結構就開始了,多少次開始又放棄,現在鼓起勇氣決定走到底。我的內容是來自 資料結構與演算法分析 c 版 寫這些內容主要是為了回憶學過的內容,再次理解各種資料結構。我的計畫是這樣的 按照書上的內容實現基本內容,熟悉各種優缺點,然後用一段時間去做習題。因為我發現書中的習題特別好!注 向量的所...
資料結構之向量vector
這裡將借助stl的vector 向量 實現動態陣列,並用它來管理資料。函式功能 複雜度size 返回向量的元素數 o 1 push back x 在向量尾新增元素x o 1 pop back 刪除向量的最後乙個元素 o 1 begin 返回指向向量開頭的迭代器 o 1 end 返回指向向量尾的迭代器...