TArray 是虚幻引擎中最常用的容器类。其设计决定了它速度较快、内存消耗较少、安全性高。
1、创建
TArray<int32> IntArray;
这会创建一个空数组,可以保存整数序列。
2、填充数据
Init
使用 Init 函数,用大量元素副本填入TArray。如:
IntArray.Init(10, 5);
// IntArray == [10,10,10,10,10]
向IntArray中填充 5 个 10 。
Add 和 Emplace
Add 和 Emplace最终效果一样,但存在细微不同:
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()