TArray
TArray是UE4的数组,TArrray为模板类因此依据UE4的命名规则开头为TUE4中最常见的容器类,其结构是由相同类型的元素组成的序列。类似C++ STL中的vector。
基础用法
声明
TArray<int32> arrayID; TArray<FString> arrayStr;
判断越界
IsValidIndex(int nIndex);
迭代
//C++ range-for方式 for (FString& Str : StrArr) { }
排序
arrayID.Sort(); //arrayID按照降序排列 arrayID.Sort([](int a, const int b) { return a < b; });
增加元素
-
Add : 把一个元素类型实例复制(或移动)到数组尾部,用于浅类型。
-
Emplace : 用传入参数构造一个新的数组元素类型的实例,添加到数组尾部。效。率比Add更好。但代码易读性上Add更好。。
-
Insert : 指定位置插入元素。
-
Append : 在尾部拼接另外一个数组。
-
AddUnique : 尾部添加一个新元素,若数组中已存在该元素则不会加入。
删除元素
-
RemoveAt : 删除指定位置的元素,删除后保证数组顺序,被删元素后面的元素会往前移动。
-
RemoveAtSwap : 功能同RemoveAt,但不保证删除后的顺序,用于无序数组,效率较高。
-
Pop : 移除数组尾部的元素。
-
Remove : 删除数组中所有与指定元素值相等的元素,返回删除个数。
-
RemoveSingle : 删除数组中第一个与指定元素值相等的元素,返回删除个数。
-
RemoveAll : 自定义条件,删除符合条件的所有元素。
-
Empty : 清空数组,所有元素都会删除。
Tip:
当数组是无序的,必须用RemoveAtSwap删除指定位置的元素,相比RemoveAt效率更高。
只删一个元素时,必须用RemoveSingle性能优于Remove,效率更高。
修改
if(nArrayID.IsValidIndex(nIndex)) nArrayID[nIndex] = newValue;
查询数组长度
int32 Count = StrArr.Num();
查找指定元素,若未找到则返回INDEX_NONE值
int32 index = StrArr.Find(TEXT("target"));
Lambda表达式高级查找
TTest* pTest = arrayTest.FindByPredicate([nFindID](TTest test) { return test.ID== nFindID; });
TArray预先分配内存
Reserve
如果预先知道数组的上限可以使用Reserve
TInlineAllocator
因为TArray是动态数组,所以我们可以使用TInlineAllocator。
我们可以把
TArray<AActor*> MyArray;
改为:
TArray<AActor*, TInlineAllocator<32>> MyAllocatedArray;
这样,我们就不用对前32个被添加到数组的元素进行任何动态分配,因为它们正好能填入作为TInlineAllocator一部分的栈的区域。在33个元素之后,所有元素都被移动到第二分配器存储。
写法上:
MyAllocatedArray的类型名显得有些长了,因此可以声明我们的数组类型。
使用typedef
typedef TArray<AActor*, TInlineAllocator<32>> AllocateArrayType;
AllocateArrayType MyArray;
//迭代
for (AllocateArrayType::TIterator Iter(MyArray); Iter; ++Iter)
{
AActor* MyActor = *Iter;
MyActor->YourFunction();
}
属性同步TArray时使用思考
有时如果只是需要更新TArray的其中一个元素,可以通过将TArray修改前的数据保存下来然后再比对修改后的数据进行对应的变更信息触发。