Unity(二) c 常用資料結構解析回顧

2021-09-29 23:52:35 字數 2393 閱讀 4603

最近做完專案後,對基礎的常用資料結構進行一下回顧,往下挖掘一下。

一、陣列

之所以把陣列單獨提出來想,是想把他們進行比較,畢竟陣列的時間關係也涉及到了他的優化改進。

陣列當仁不讓是最基礎的結構了。c#裡按時間線是array——arraylist——list。但arraylist應該是裡面使用率最低的了,原因往下說。

1)array

1)array在記憶體上的儲存是連續的。

2)array中的元素必須是同型別的。

3)array直接通過下標訪問(後面會和鍊錶比較)。

優點:1)賦值與修改元素方便。

2)查詢速度快。

缺點:1)插入和從中間刪除不方便,需要自己控制陣列大量的移動元素進行操作。

2)初始化時需要定義長度,定義太大會資源浪費,定義太小會產生溢位

這是最基礎的陣列,在資料量不大的時候使用起來非常方便,速度快效率高。

2)arraylist

為了解決array中的缺點暴露出來的問題,arraylist可以說是使用起來非常完美,新增,刪除,插入,賦值,查詢都非常方便。

優點:初始化時不用宣告長度,會根據儲存動態的改變長度。

缺點:可以儲存不同的型別。

這個缺點看起來非常像優點,但是這是對於使用者而言的優點,對於程式猿來說,情況就不一樣了。這得從arraylist的實現上來看:

1)這不是型別安全的:

arraylist的預設型別是object,如果說儲存的是int型別,那在arraylist中就會把他轉化為object型別,當使用的時候還需要再轉回int型別。如果使用的時候不把型別轉回來的而直接使用的話,是會編譯報錯的。而且即使轉換了,也可能由於轉換的型別不對產生型別不匹配。

2)效率低下

首先考慮為什麼會報錯,那是因為儲存在arraylist裡面的東西如果直接取出,得到的是乙個object引用,想要獲得我們需要的東西就需要再轉換型別到當初存入的型別。這就是裝箱與拆箱操作。

裝箱:把「值型別」轉換成「引用型別」(object)。

拆箱:把「引用型別」轉換成「值型別」。

值型別的變數直接包含資料,引用型別的變數儲存對資料的引用。

這其中就涉及到為新生成的引用物件分配記憶體、將值型別的資料拷貝到剛剛分配的記憶體中、返回新分配物件的位址這些操作,而分配記憶體和拷貝是非常消耗效能的。在資料量大的情況下,這種操作是不可取的。

3)list < t >

優點:1)效能:這是不需要型別轉換的,可以避免值型別和引用型別之間拆裝箱帶來的效能損失。

2)型別安全:限制了使用的資料型別,在編譯時就可以檢查型別錯誤。

這個應該都很熟悉了。這是在arraylist之後,也就是c#2.0新增的泛型,很明顯,他修正了arraylist的缺點,限制了型別,也不需要拆裝箱,極大的提高了效能。

注意點其實在這裡應該可以注意到。裝箱和拆箱是值型別和引用型別之間的轉換,但是如果儲存的本身就是引用型別呢?那麼就不涉及拆裝箱的問題,所以如果本身就是引用型別,那麼arraylist和list< t >的差距就沒那麼大了。但是,不論如何,list< t >是型別安全的。

二、listdictionary、linkedlist

listdictionary單項鍊表,linkedlist雙向鍊錶。其結構就不多贅述了,主要說一下與陣列的比較。

比較:1)、位置:

陣列中的位置有其下標決定,也就是順序決定,在記憶體中時連續的。

鍊錶中的位置由其節點內的引用關係決定,在記憶體中是可以不連續的。

2)、插入與中間刪除:

陣列的插入與中間刪除效率低,需要大量操作後置元素。

鍊錶的插入與中間刪除效率高,只需修改插入位置的前置與後置元素的引用即可,操作簡單。

3)查詢:

陣列查詢效率高,查詢方便。有隨機性,可以直接根據下標獲取陣列內任一元素。

鍊錶查詢效率比較低,不能下標查詢,不具有隨機性。需要從已知節點(通常是頭結點)開始按照鏈式乙個乙個向下尋找。

4)記憶體:

陣列記憶體要求高,需要求復合要求的連續記憶體空間。

鍊錶記憶體要求低,不需要連續空間。

5)擴充套件:

陣列不能動態擴充套件,上面的陣列其底層都是由array實現的,都會有乙個預設的初始長度,而且當長度不夠時會將當前容量擴容2倍,不可避免的會造成記憶體浪費。

鍊錶能夠動態擴充套件,因為是不連續的鏈結節點,所以有多少節點就占用多少記憶體,不造成記憶體浪費。

三、stack、queue

stack棧、queue佇列,比較普遍了。簡單的提一句。

棧是後進先出,通常用於就近或者優先順序,比如後退功能,歷史記錄,符號運算等。

佇列是先進先出,通常用於順序執行,任務之類。

三、dictionary

由於時間問題,後面說的越來越淺了,以後會回來補充的~

有不對的地方歡迎指正~ 謝謝 ~ 一起學習~

unity 資料結構

1.陣列 特點1.陣列是一塊連續的記憶體空間,以下標來描述空間的位置。下標從0開始,最大下標為陣列長度 1 2.陣列的元素都是變數,變數的型別為定義陣列時的型別。3.陣列建立後會對每個元素進行初始化。4.陣列建立後,不能改變。優點 1 按照索引查詢元素速度快 2 能儲存大量資料 3 按照索引遍歷陣列...

C 常用資料結構

資料結構 型別及備註 插入和刪除 查詢array 順序儲存的線性表 定長 不支援 這裡的插入與刪除指會更改表長的行為 o n linkedlist 鏈式儲存的線性表 不定長 o 1 o n list 順序儲存的線性表 不定長 動態擴容 o n 結尾則是o 1 o n stack 棧 不定長 動態擴容...

C 常用資料結構

array arraylist list linkedlist queue stack dictionary 陣列array特點 儲存在連續的記憶體上 元素型別相同 直接通過下表訪問 建立時需要指定陣列長度 根據下標索引元素並進行相關操作速度快,但插入或刪除元素比較麻煩 arraylist 非泛型集...