記錄一下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;
