【UE4从零开始 010】容器之TArray

本文深入探讨虚幻引擎中的TArray容器类,讲解其创建、填充、遍历、排序、查询、移除操作及测试代码示例。涵盖Add、Emplace、Append、SetNum、Sort、StableSort、Remove、Slack等关键方法,助您掌握TArray高效使用技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

TArray 是虚幻引擎中最常用的容器类。其设计决定了它速度较快、内存消耗较少、安全性高。

1、创建

TArray<int32> IntArray;

这会创建一个空数组,可以保存整数序列。

2、填充数据

Init

使用 Init 函数,用大量元素副本填入TArray。如:

IntArray.Init(10, 5);
// IntArray == [10,10,10,10,10]

向IntArray中填充 510

AddEmplace

AddEmplace最终效果一样,但存在细微不同:

	TArray<FString> StrArr;
	StrArr.Add(TEXT("Hello"));
	StrArr.Emplace(TEXT("World"));
	// StrArr == ["Hello","World"]

Add 将创建一个临时 FString,然后将临时内容移至容器内的新FString中;
Emplace 将会直接创建新FString。

虽然最终结果一样,但 Emplace 可避免创建不必要的临时变量,效率比 Add 高,但 Add 可读性强。因此可以在浅显类型上使用Add,在其他类型上使用Emplace。

Append

使用 Append 可以从另一个TArray常规数组 一次性添加多个元素。

	FString Arr[] = { TEXT("of"), TEXT("Tomorrow") };
	StrArr.Append(Arr, ARRAY_COUNT(Arr));
	// StrArr == ["Hello","World","of","Tomorrow"]
AddUnique

添加一个TArray中不存在的元素,如果已经存在则不会添加。使用运算符 == 检查是否相等。

	StrArr.AddUnique(TEXT("!"));
	// StrArr == ["Hello","World","of","Tomorrow","!"]

	StrArr.AddUnique(TEXT("!"));
	// StrArr is unchanged as "!" is already an element
Insert

在指定索引处插入元素。

	StrArr.Insert(TEXT("Brave"), 1);
	// StrArr == ["Hello","Brave","World","of","Tomorrow","!"]
SetNum

设置TArray元素数量,如果大于当前数量,则使用元素类型的默认构造函数创建新元素,如果数量小于当前数量,则将移除多余的元素。

	StrArr.SetNum(8);
	// StrArr == ["Hello","Brave","World","of","Tomorrow","!", "", ""]

	StrArr.SetNum(6);
	// StrArr == ["Hello","Brave","World","of","Tomorrow","!"]

3、遍历

有多种方法可遍历TArray,推荐使用C++的 ranged-for’

	FString JoinedStr;
	for (auto& Str : StrArr)
	{
		JoinedStr += Str;
		JoinedStr += TEXT(" ");
	}
	// JoinedStr == "Hello Brave World of Tomorrow ! "

也可使用基于索引的for循环:

	for (int32 Index = 0; Index != StrArr.Num(); ++Index)
	{
		JoinedStr += StrArr[Index];
		JoinedStr += TEXT(" ");
	}

还可使用迭代器进行遍历。函数 CreateIterator 和 **CreateConstIterator ** 可分别用于元素的读写和只读访问:

	for (auto It = StrArr.CreateConstIterator(); It; ++It)
	{
		JoinedStr += *It;
		JoinedStr += TEXT(" ");
	}

以上3中遍历效果相同。

4、排序

Sort
	StrArr.Sort();
	// StrArr == ["!","Brave","Hello","of","Tomorrow","World"]

这里是使用元素类型的 运算符 “<” 来进行比较排序。

Sort 函数还可以传入一个 Lambda表达式 来自定义比较规则。如:

	StrArr.Sort([](const FString& A, const FString& B) {
		return A.Len() < B.Len();
		});
	// StrArr == ["!","of","Hello","Brave","World","Tomorrow"]

此时是按字符串长度进行排序。注意:等值元素(“Hello”、“Brave”和“World” 长度相同)的相对排序无法保证。

HeapSort
	StrArr.HeapSort([](const FString& A, const FString& B) {
		return A.Len() < B.Len();
		});
	// StrArr == ["!","of","Hello","Brave","World","Tomorrow"]

HeapSort,堆排序。是否使用 HeapSort 取决于特定数据以及与 Sort 相比排序的效率。与 Sort 一样,HeapSort 也无法保证等值元素的相对排序。

StableSort
	StrArr.StableSort([](const FString& A, const FString& B) {
		return A.Len()
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值