資料結構 vector

2021-08-08 17:44:55 字數 2653 閱讀 4515

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 返回指向向量尾的迭代器...