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;
作者:KillerAery
出处:http://www.cnblogs.com/KillerAery/
本文版权归作者和博客园共有,未经作者同意不可擅自转载,否则保留追究法律责任的权利。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了