容器是一种类,它的主要功能是存储数据集合。最常见的这些类包括 TArray、TMap 和 TSet。每个类都会自动调节大小,因此增长到您所需的大小。
Containers完整主题:容器API

TArray

在所有三个容器中,在虚幻引擎4中将会使用的主要容器是TArray,它的功能与 std::vector 十分相似,但会提供更多功能。以下是一些常见操作:

  1. TArray<AActor*> ActorArray = GetActorArrayFromSomewhere();
  2. // 告知当前ActorArray中存储了多少个元素(AActor)。
  3. int32 ArraySize = ActorArray.Num();
  4. // TArray基于0(第一个元素将位于索引0处)
  5. int32 Index = 0;
  6. // 尝试检索给定索引处的元素
  7. AActor* FirstActor = ActorArray[Index];
  8. // 在数组末尾添加新元素
  9. AActor* NewActor = GetNewActor();
  10. ActorArray.Add(NewActor);
  11. // 在数组末尾添加元素,但前提必须是该元素尚不存在于数组中
  12. ActorArray.AddUnique(NewActor); // 不会改变数组,因为已经添加了NewActor。
  13. // 从数组中移除"NewActor"的所有实例
  14. ActorArray.Remove(NewActor);
  15. // 移除指定索引处的元素
  16. // 索引之上的元素将下移一位来填充空白空间
  17. ActorArray.RemoveAt(Index);
  18. // 更高效版本的"RemoveAt",但不能保持元素的顺序
  19. ActorArray.RemoveAtSwap(Index);
  20. // 移除数组中的所有元素
  21. ActorArray.Empty();

TArray 添加了对其元素进行垃圾回收的好处。这样会假设 TArray 存储了 UObject 派生的指针。

  1. UCLASS()
  2. class UMyClass : UObject
  3. {
  4. GENERATED_BODY();
  5. // ...
  6. UPROPERTY()
  7. AActor* GarbageCollectedActor;
  8. UPROPERTY()
  9. TArray<AActor*> GarbageCollectedArray;
  10. TArray<AActor*> AnotherGarbageCollectedArray;
  11. };

完整主题:TArray
完整主题:TArray API

TMap

TMap 是键-值对的集合,类似于 std::map。TMap 具有一些根据元素键查找、添加和移除元素的快速方法。您可以使用任意类型来表示键,因为它定义有 GetTypeHash 函数,我们稍后将进行介绍。
假设您创建了一个基于网格的棋盘游戏,并需要存储和查询每一个正方形上的内容。TMap 会为您提供一种简单的可用方法。如果棋盘较小,并且尺寸不变,那么或许会有更有效的方法来达到此目的,但在此示例中,我们假设了一个尺寸较大、带有少量棋子的棋盘。

  1. enum class EPieceType
  2. {
  3. King,
  4. Queen,
  5. Rook,
  6. Bishop,
  7. Knight,
  8. Pawn
  9. };
  10. struct FPiece
  11. {
  12. int32 PlayerId;
  13. EPieceType Type;
  14. FIntPoint Position;
  15. FPiece(int32 InPlayerId, EPieceType InType, FIntVector InPosition) :
  16. PlayerId(InPlayerId),
  17. Type(InType),
  18. Position(InPosition)
  19. {
  20. }
  21. };
  22. class FBoard
  23. {
  24. private:
  25. // 通过使用TMap,我们可以按位置引用每一块
  26. TMap<FIntPoint, FPiece> Data;
  27. public:
  28. bool HasPieceAtPosition(FIntPoint Position)
  29. {
  30. return Data.Contains(Position);
  31. }
  32. FPiece GetPieceAtPosition(FIntPoint Position)
  33. {
  34. return Data[Position];
  35. }
  36. void AddNewPiece(int32 PlayerId, EPieceType Type, FIntPoint Position)
  37. {
  38. FPiece NewPiece(PlayerId, Type, Position);
  39. Data.Add(Position, NewPiece);
  40. }

完整主题:TMap
完整主题:TMap API

TSet

TSet 存储唯一值集合,类似于 std::set。虽然通过 TArray 可通过其 AddUnique 和 Contains 方法支持类似集的行为,TSet 可以更快的实现这些运算且不会自动添加非独有元素。

  1. TSet<AActor*> ActorSet = GetActorSetFromSomewhere();
  2. int32 Size = ActorSet.Num();
  3. // 向集添加元素,但前提是集尚未包含这个元素
  4. AActor* NewActor = GetNewActor();
  5. ActorSet.Add(NewActor);
  6. // 检查元素是否已经包含在集中
  7. if (ActorSet.Contains(NewActor))
  8. {
  9. // ...
  10. }
  11. // 从集移除元素
  12. ActorSet.Remove(NewActor);
  13. // 从集移除所有元素
  14. ActorSet.Empty();
  15. // 创建包含TSet元素的TArray
  16. TArray<AActor*> ActorArrayFromSet = ActorSet.Array();