Unity C#筆記 容器類


記錄一下Unity C#常用的容器,方便寫腳本時忘了容器類來查下 (- -||)

動態數組

List<T>

using System.Collections.Generic; //泛型容器的命名空間

類似C++的vector<T>。

有另一個非常相似的非泛型容器:ArrayList。ArrayList可以插入不同的值類型,在數據檢索及存儲時存在裝箱與拆箱操作,容易帶來性能消耗。
而List<T>則可以避免了裝箱與拆箱動作的性能耗費,而且類型更安全。

雙向鏈表

LinkedList<T>

using System.Collections.Generic; //泛型容器的命名空間

類似C++的list<T>。

額外的,LinkedListNode<T> 是雙向鏈表的節點類型

隊列

Queue<T>

using System.Collections.Generic; //泛型容器的命名空間

類似C++的queue<T>。

Queue<T>的底層是動態數組實現的隊列

Stack<T>

using System.Collections.Generic; //泛型容器的命名空間

類似C++的stack<T>。

Stack<T>的底層是動態數組實現的棧

查找二叉樹

SortedDictionary<K,V>

using System.Collections.Generic; //泛型容器的命名空間

類似C++的map<K,V>。

有另一個也非常相似功能的SortedList<K,V>,但是它的實現不是二叉樹,而是每次插入都要排序的數組(真如其名),
所以插入刪除速度都是O(n),而且其用處比較少(例如要求O(1)速度找出第幾大),就不放出來了。

哈希表

HashSet<K> & Dictionary<K,V>

using System.Collections.Generic; //泛型容器的命名空間

類似C++的unorderd_set<K>和unorderd_map<K,V>。

額外的,KeyValuePair<K,V> 是鍵/值對結構,用於輔助Dictionary<K,V>結構。

位數組

BitArray

using System.Collections; //非泛型容器的命名空間

類似C++的bitset。

原生數組

NativeArray<T>

using Unity.Collections; //NativeArray<T>的命名空間

NativeArray<T>只能容納值對象。

在創建的時候除了指定length外,還需要指定allocator模式:Temp(臨時),TempJob(Job內臨時),Persistent(持久)

//示例,容量233,臨時內存
NativeArray<T> array = new NativeArray<T>(233,Allocator.Temp);

這是Unity官方提供的容器類,它所指定的allocator模式可能是類似Temp對應棧內存分配,Persistent對應堆內存分配的方式。
它只是簡單的封裝一下數組,本質和普通的struct數組似乎沒什么區別,都能內存連續使cpu更容易命中緩存。
但是使用NativeArray能更加強調這是在使用值類型的數組,而非類對象數組。避免下面情況出現:

//不能直接分辨ST是結構體還是類
ST[] array = new ST[1024];
//錯把st當作類對象來修改,實際上這樣只是拷貝一份ST然后再對拷貝出來的進行修改
var st = array[0];
st.x = 0;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM