返回 导航

UE5

hangge.com

UE5 - UC++中容器类的使用详解1(TArray、TSet)

作者:hangge | 2026-11-02 08:43
    在前面学习蓝图的时候,我们已经知道 UE5 中的三种常用容器类:Array、Map 和 Set,它们在 UC++ 中分别对应的类型是 TArray<T>、TMap<K,V> 和 TSet<T> 类(注意:UC++ 中的容器类在命名上均以 T 开头)。本文首先介绍 TArray 和 TSet 的使用。
    由于 TSet 的接口与 TArray 高度相似, 包括了 Add、Remove 和 Num 等函数。区别在于 TSet 只能添加容器中不存在的元素。因此下面以 TArray 为例进行演示,TSet 就不再赘述了。

一、TArray 的使用(TSet 同理)

1,准备工作(创建元素的类型)

(1)我们将会创建一个继承于 UObject 的类来作为容器的元素类型。打开 VS,在 Solution Explorer 中,找到 Source 文件夹,在空白处右击,在弹出的菜单中选择“Add”→“New tem”来增加一个文件。在弹出的面板中,选择“HeaderFile(头文件)”,然后将文件命名为“MyArrayElement.h”。通过窗口底部的 Location 选项,选择所在目录下的“Source\项目名”目录,比如我这里就是“Source\demo3”。

(2)然后在 MyArrayElement.h 文件中输入如下代码,由于这个类完全是作为测试用的,没有任何静态变量或者成员函数,所以不创建对应的 CPP 源文件也行。 
#pragma once

#include "CoreMinimal.h"
#include "MyArrayElement.generated.h"

UCLASS()
class UMyArrayElement : public UObject
{
	GENERATED_BODY()
};

2,TArray 的创建

下面代码创建一个元素类型是 UMyArrayElement 指针的 TArray。
TArray<UMyArrayElement*> MyArray;

3,添加新元素

(1)创建完 TArray 后,我们就可以向 TArray 里添加新的元素,使用的是 TArray<T>::Add() 函数。
(2)下面代码我们使用 NewObject<T> 函数创建了一个 UMyArrayElement 实例,并将它的指针加入到了前面创建的 MyArray 中。
UMyArrayElement* Element = NewObject<UMyArrayElement>(this);
MyArray.Add(Element);

4,移除元素

(1)我们还可以使用 TArray<T>:Remove() 函数从 TArray 中移除某个元素,参数传入要移除的元素就可以了。下面代码我们传入了 Element 作为参数,那么 MyArray 中所有的 Element 元素都会被从 MyArray 中移除。 
MyArray.Remove(Element);

(2)如果我们想移除的是 TArray 中的最后一个元素,那么可以使用 TArray<T>:Pop() 函数。
MyArray.Pop(); 

5,获取元素个数

使用 TArray<T>:Num() 可以获取 TArray 的长度。
int32 ArrayLength = MyArray.Num();

6,获取元素

(1)使用 [] 符号和元素的下标,可以从 TArray 中获取下标对应的元素。
(2)下面代码我们使用 0 作为元素下标,获取了 MyArray 中的第零个元素。 
UMyArrayElement* Element0 = MyArray[0];

7,遍历 TArray

(1)第一种方法是使用下标来逐个获取 TArray 的元素。下面代码我们先使用 Num() 函数来获取元素的个数,然后使用一个 for 循环来计算元素的下标,再使用元素下标获取对应的元素。 
for (int32 Index = 0; Index < MyArray.Num(); Index++)
{
	UMyArrayElement* Element = MyArray[Index];
}

(2)第二种方法是使用 for-each 来遍历 TArray。
for (UMyArrayElement* Element : MyArray)
{

}

附:当元素类型为 Struct 时获取和使用元素的注意事项

(1)当容器的元素类型为 Struct 时要特别小心。假设我们创建了一个 UStruct,名为“FTestArrayElementStruct”,它的内容仅有一个 int32 成员变量,名为 Value。
#pragma once

#include "CoreMinimal.h"
#include "TestArrayElementStruct.generated.h"

USTRUCT()
struct FTestArrayElementStruct
{
    GENERATED_BODY()
    int32 Value = 0;
};

(2)当我们把它作为数组元素的时候,需要注意引用的问题。比如下面下面代码 UE_LOG 最终打印出来的值是 1,而不是 2。
  • 因为 FTestArayElementStruct Element0=StructArray[0]; 这句代码实际上是将结构体实例从 StructArray 中获取出来,并作为复制构造函数的参数又创建了 Element0,所以 Element0 和 StructArray[0] 其实并不是同一个实例。也就是说对于 Elenant0 的修改不会影响到 StructAray[0]。 
TArray<FTestArrayElementStruct> StructArray; 
FTestArrayElementStruct Element;
Element.Value = 1;
StructArray.Add(Element);
FTestArrayElementStruct Element0 = StructArray[0];
Element0.Value = 2;
UE_LOG(LogTemp, Log, TEXT("gd"), StructArray[0].Value)

(3)如果想要修改 StructArray 中元素的内容,我们可以采用如下两种方式。
  • 方式 1:直接修改第 0 个元素值:
StructArray[0].Value = 2;
FTestArrayElementStruct& Element0 = StructArray[0];
Element0.Value = 2;
评论

全部评论(0)

回到顶部