前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【虚幻引擎|UE4】TArray在C++中的使用

【虚幻引擎|UE4】TArray在C++中的使用

原创
作者头像
六月丶
发布2023-08-02 22:39:29
5430
发布2023-08-02 22:39:29
举报
文章被收录于专栏:六月-游戏开发六月-游戏开发

简介

TArray 类似于STL的vector,可以自动扩容,因为提供了相关操作函数,所以当作队列、栈、堆来使用也很方便,是UE4中最常用的容器类。其速度快、内存消耗小、安全性高。TArray 类型由两大属性定义:元素类型和可选分配器。

可以前往官方文档TArray查看更详细介绍。

声明

代码语言:c++
复制
//TArray<元素类型> 变量名;
TArray<int32> IntArray;
TArray<TSubClassOf<AGameModeBase>> GMArray;

初始化

声明完默认为空数组,也可以用Init初始化容器:

Init

初始化为Number个Element值

代码语言:c++
复制
//Init(const ElementType& Element, SizeType Number)
IntArray.Init(10, 5);

增删改查

注意:成员函数通常都有多个重载,代码中我仅列举部分常用的重载函数原型。

Add & Emplace

向末尾添加新元素

代码语言:c++
复制
//SizeType Add(ElementType&& Item)
//SizeType Add(const ElementType& Item)
InitArray.Add(3);

//template <typename... ArgsType>
//SizeType Emplace(ArgsType&&... Args)
InitArray.Emplace(3);

两者区别

多数效果相同,细微区别:

Add(或 Push)将元素类型的实例复制(或移动)到数组中。

Emplace 使用给定参数构建元素类型的新实例。

总体而言,Emplace 优于 Add,因其可避免在调用点创建无需临时变量。

Append

使用另一个TArray或C数组来一次添加多个元素至末尾

代码语言:c++
复制
//template <typename OtherElementType, typename OtherAllocator>
//void Append(const TArray<OtherElementType, OtherAllocator>& Source)
//
//void Append(const ElementType* Ptr, SizeType Count)
TArray<int32> NewIntArray;
NewIntArray.Append(IntArray);

int32 IntList[] = { 1,3,5,7 };
NewIntArray.Append(IntList, ARRAY_COUNT(IntList));

AddUnique

仅在尚不存在等值元素时,AddUnique 才会向容器添加新元素。(内部使用元素的'=='判断)

代码语言:c++
复制
//SizeType AddUnique(ElementType&& Item)
//SizeType AddUnique(const ElementType& Item)
IntArray.AddUnique(10);			//不会添加,内部已有10
IntArray.AddUnique(100);		//添加成功

Insert

将元素或数组副本插入到指定索引处

代码语言:c++
复制
//SizeType Insert(ElementType&& Item, SizeType Index)
//SizeType Insert(const TArray<ElementType, OtherAllocator>& Items, const SizeType InIndex)
IntArray.Insert(5, 0);
IntArray.Insert(NewIntArray, 1);

Remove

移除Array中等值的所有元素(内部使用元素的==判断)

代码语言:c++
复制
IntArray.Remove(20)		//原{1,20,3,20}  新{1,3}

RemoveSingle

删除匹配的首个元素

代码语言:c++
复制
IntArray.RemoveSingle(20)		//原{1,20,3,20}  新{1,3,20}

RemoveAt

删除指定索引处元素

如传递无效索引将引发运行时错误

代码语言:c++
复制
IntArray.RemoveAt(2)		//原{1,20,3,20}  新{1,20,20}

RemoveAll

删除与谓词匹配的所有元素

代码语言:c++
复制
//例如移除值为3的倍数的元素
IntArray.RemoveAll([](int32 Val){
	return Val % 3 == 0;
}

补充:上面的删除会因为后续元素移动而产生性能开销,如果对剩余元素排列顺序没有要求可使用xxxSwap版本(例RemoveAtSwap)来降低开销。

Empty

移除所有元素

代码语言:c++
复制
IntArray.Empty();

通过索引获取元素引用,然后修改即可,详见下面的查。

[]

通过下标索引返回对应元素的引用,因为是引用所以可以改变容器元素。

注:索引范围取[0,n),否则引发运行时错误

代码语言:c++
复制
int& temp = IntArray[0];		//取IntArray索引0的元素
temp = -1;			//会修改IntArray[0]

Top

取末尾顶部元素

代码语言:c++
复制
IntArray.Top();

Last

反向取元素

代码语言:c++
复制
int32 IEnd = IntArray.Last(0);		//倒数第一个元素,也可省略为Last()
int32 IEnd1 = IntArray.Last(1);		//倒数第二个元素

Contains

查询Array是否包含某元素

代码语言:c++
复制
bool haveFive = IntArray.Contains(5);		

Find & FindLast

查找元素,找到就将索引写入参数2

其中Find为顺序查找第一个,FindLast为反向查找第一个

代码语言:c++
复制
int findIdx;
bool isFind = IntArray.Find(5, findIdx);
bool isFind = IntArray.FindLast(5, findIdx);

//用法2
FindIdx = IntArray.Find(5);
if (FindIdx != INDEX_NONE) {		//找到

}

迭代

  1. 使用ranged-forfor (const int32 &num : IntArray) { UE_LOG(LogTemp, Log, TEXT("%d"), num); }for (int i = 0; i < IntArray.Num(); i++) { UE_LOG(LogTemp, Log, TEXT("%d"), IntArrayi); }
  2. 使用索引
  3. 使用数组迭代器//CreateConstIterator() && CreateIterator() for (auto It = IntArray.CreateConstIterator(); It; It++) { UE_LOG(LogTemp, Log, TEXT("%d"), *It); }

排序

Sort

数值按元素类型的 运算符< 排序。在FString中,此为忽略大小写的词典编纂比较。

稳定排序。

可自定义比较器。

代码语言:c++
复制
IntArray.Sort();

//自定义比较器
StrArray.Sort([](const FString& A, const FString& B) {
	return A.Len() < B.Len();
	});

其他常用函数

Num

获取容器元素数量

代码语言:c++
复制
IntArray.Num()

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 简介
  • 声明
  • 初始化
  • 增删改查
    • 迭代
    • 排序
    • 其他常用函数
    相关产品与服务
    容器服务
    腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档