简介
虚幻容器时对同质资源进行管理的容器,包括TArray、TMap和TSet三种,均使用泛型进行创建,且不可创建在堆区,即不能使用new进行创建。
三种容器的操作与C++中的STL操作类似,提供的接口略有不同,但实现的功能几乎是相同的。
TArray
TArray是UE中的数组,也是最常用的容器,其速度快,内存消耗小,安全性高。
TArray创建
1 | //首先声明一个容器,类型为int32 |
向数组中添加元素
添加可以使用Add和Emplace函数,二者的区别在于:
- Add将元素类型的实例复制到数组中。
- Emplace将元素类型的实例直接构造到数组中。
- Emplace可以避免创建临时对象,效率会更高些,但最终结果与Add是相同的。
1 | TArray<int32> Array; |
除此之外,还可以使用AddUnique和Append来添加,AddUnique会检查数组中是否已经存在该元素,不存在则添加;Append优势在于可以一次添加多个元素。
1 | Array.AddUnique(4); //添加成功 |
以上都是在末尾添加元素,但如果想在指定位置添加元素,则可以使用Insert函数,用法与Add类似,只不过要加上插入位置。
1 | Array.Insert(0,2); //在第二个位置添加元素0 |
TArray的访问
TArray既可以通过原生的for循环遍历访问(UE重载了[]运算符),也可以使用迭代器进行访问。
1 | for(int32 i=0;i < Array.Num();i++){ |
TArray的移除
UE中提供了几种移除的方法:
- Remove,直接移除某个元素,会移除所有匹配的元素
- RemoveAt,移除指定位置的元素
- RemoveSingle,移除首个匹配元素
- RemoveAll,用于移除与谓词匹配的元素
- 也可以使用Empty移除所有元素
TArray的其它操作
- 获取数组大小:Num()
- 重新设置数组大小:SetNum()
- 查找某个元素:Array.Find(Element)
- 是否包含某个元素:Array.Contains(Element)
- 对数组进行排序:Array.Sort()
对数组进行堆操作
UE中对数组的堆操作进行了实现,并提供了以下接口:
- Heapify,可以将一个数组调整为堆,默认为小顶堆
- HeapPush,将新元素添加到堆
- HeapTop(Elem),获取堆顶元素
- HeapRemoveAt,移除堆中某个索引位置的元素
TMap
与原生C++的map类似,TMap也是键值对的形式,并且键是唯一的,当有重复的键时,新的值将会替换旧值;在TMultiMap中,键可以重复,但值必须唯一。
TMap的创建与访问
1 | //创建与原生C++类似,都是<KeyType,ValueType>的形式 |
对TMap进行迭代
迭代方法有两种,可以直接使用auto,也可以使用迭代器。
1 | for(auto& Elem:Map){ |
TMap的查找与移除
TMap对[]实现了重载,可以直接使用Map[Key]进行查询,或者使用FindKey来查询Map中是否含有某个键,如果找到则会返回该键。
对于TMap的移除,最直接的便是使用Remove(Key)来实现。
此外还提供了FindAndRemoveChecked和RemoveAndCopyValue两个函数,它们都可以移除某个键,但区别在于:
- FindAndRemoveChecked会返回被移除键所对应的值
- RemoveAndCopyValue的参数为(Key,RemovedValue),Key为要移除的键,RemovedValue为被移除键所对应的值,会通过参数的形式返回,而这个函数的返回值为bool,为true时表示移除成功,反之
TMap的补充操作
TMap也可以向TArray那样进行排序,并且使用二元谓词进行排序,使用与STL类似
TMap还重载了赋值操作,可以直接将一个Map赋值给新的Map,还可以使用Map[Key]=Value来赋值
TSet
TSet将Value直接作为键来使用,作为一种快速容器,可以在不要求元素顺序的情况下用来存储唯一元素
对TSet的操作基本都与TArray和TMap类似,就不再过不叙述
参考文档
https://docs.unrealengine.com/4.27/zh-CN/ProgrammingAndScripting/ProgrammingWithCPP/UnrealArchitecture/TArrays/
https://docs.unrealengine.com/4.27/zh-CN/ProgrammingAndScripting/ProgrammingWithCPP/UnrealArchitecture/TMap/
https://docs.unrealengine.com/4.27/zh-CN/ProgrammingAndScripting/ProgrammingWithCPP/UnrealArchitecture/TSet/
- 本文作者: KongXinQing
- 本文链接: https://13114987559.github.io/2023/10/15/essay/虚幻容器使用/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!