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

news2025/4/12 0:47:53

简介

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

声明

//TArray<元素类型> 变量名;
TArray<int32> IntArray;
TArray<TSubClassOf<AGameModeBase>> GMArray;

初始化

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

//Init(const ElementType& Element, SizeType Number)
IntArray.Init(10, 5);

在这里插入图片描述

增删改查

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

Add & Emplace
向末尾添加新元素

//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数组来一次添加多个元素至末尾

//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 才会向容器添加新元素。(内部使用元素的’=='判断)

//SizeType AddUnique(ElementType&& Item)
//SizeType AddUnique(const ElementType& Item)
IntArray.AddUnique(10);			//不会添加,内部已有10
IntArray.AddUnique(100);		//添加成功

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

//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中等值的所有元素(内部使用元素的==判断)

IntArray.Remove(20)		//原{1,20,3,20}  新{1,3}

RemoveSingle
删除匹配的首个元素

IntArray.RemoveSingle(20)		//原{1,20,3,20}  新{1,3,20}

RemoveAt
删除指定索引处元素
如传递无效索引将引发运行时错误

IntArray.RemoveAt(2)		//原{1,20,3,20}  新{1,20,20}

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

//例如移除值为3的倍数的元素
IntArray.RemoveAll([](int32 Val){
	return Val % 3 == 0;
}

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

Empty
移除所有元素

IntArray.Empty();

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

[]
通过下标索引返回对应元素的引用,因为是引用所以可以改变容器元素。
注:索引范围取[0,n),否则引发运行时错误

int& temp = IntArray[0];		//取IntArray索引0的元素
temp = -1;			//会修改IntArray[0]

Top
取末尾顶部元素

IntArray.Top();

Last
反向取元素

int32 IEnd = IntArray.Last(0);		//倒数第一个元素,也可省略为Last()
int32 IEnd1 = IntArray.Last(1);		//倒数第二个元素

Contains
查询Array是否包含某元素

bool haveFive = IntArray.Contains(5);		

Find & FindLast
查找元素,找到就将索引写入参数2
其中Find为顺序查找第一个,FindLast为反向查找第一个

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-for

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

排序

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

IntArray.Sort();

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

其他常用函数

Num
获取容器元素数量

IntArray.Num()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/468534.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

smardaten社区版/专业版发布,查看特性与区别!

为满足个人和中小团队开发者需求&#xff0c;近期smardaten正式推出社区版与专业版&#xff0c;其中社区版为免费版本&#xff0c;支持一键下载安装。 值得一提的是&#xff0c;本次社区版和专业版&#xff0c;均支持独立私有部署&#xff0c;并进行商业应用交付。 熟悉smard…

Linux网络——Shell编程之条件语句—if 、case

Linux网络——Shell编程之条件语句—if 、case 一、条件测试1.test命令2.文件测试3.整数值比较4.逻辑测试 二、if语句1.单分支结构2.双分支结构3.多分支结构4.实践操作 三、case分支语句1.case多分支结构2.实践操作 一、条件测试 1.test命令 测试表达式是否成立&#xff0c;若…

信息收集(二)IP信息收集

信息收集&#xff08;一&#xff09;域名信息收集 什么是CDN&#xff1f; 内容分发网络&#xff08;CDN&#xff09;&#xff1a; 是指企业利用分布在不同区域的节点服务器群组成流量分配管理平台&#xff0c;为用户提供内容分散存储和高速缓存服务 在渗透测试过程中&#x…

大数据好学么

大数据本质上是海量数据。 以往的数据开发&#xff0c;需要一定的Java基础和工作经验&#xff0c;门槛高&#xff0c;入门难。 如果零基础入门数据开发行业的小伙伴&#xff0c;可以从Python语言入手。 Python语言简单易懂&#xff0c;适合零基础入门&#xff0c;在编程语言…

kafka集群模拟单节点故障

这里通过kafka manage来展示节点宕机效果 现在三台主机节点均正常 topic正常识别到三个broker leader也均匀分配到了三个broker上 现在把节点id为0的主机模拟宕机 可以通过以上两张图片看到每个topic现在只识别到了两个broker节点,broker id为0的节点已经被剔除掉了 isr列…

SpringBoot框架(邮件发送Mail|持久层框架JPA|Extra前后端分离跨域处理|接口管理Swagger)这一篇就够了(超详细)

&#x1f648;作者简介&#xff1a;练习时长两年半的Java up主 &#x1f649;个人主页&#xff1a;老茶icon &#x1f64a; ps:点赞&#x1f44d;是免费的&#xff0c;却可以让写博客的作者开兴好久好久&#x1f60e; &#x1f4da;系列专栏&#xff1a;Java全栈&#xff0c;计…

【Python表白集】没有哪个女孩子 不喜欢花 不喜欢惊喜:“一束花的仪式感,永远不会过时呢~”(turtle绘图代码)

导语 “我想和你在一起虚度时光&#xff0c;坐看云卷云舒&#xff0c;花开花落” 所有文章完整的素材源码都在&#x1f447;&#x1f447; 粉丝白嫖源码福利&#xff0c;请移步至CSDN社区或文末公众hao即可免费。 又快到了一年小长假的时候啦&#xff0c; 单身狗的你们还好嘛…

如何有效使用渲染农场?防止渲染出错的7个方法!

如何使用渲染农场&#xff1f;又如何有效地使用渲染农场&#xff0c;使用云渲染农场时出错怎么办&#xff1f; 众所周知我们可以在任意的笔记本或者终端PC上面来创作 3ds Max 场景&#xff0c;但是实际渲染是这样吗&#xff1f;其实不然&#xff0c;这其中的差距不是一星半点&…

在 iOS 16 中用 SwiftUI Charts 创建一个折线图

前言 苹果在 WWDC 2022 上推出了 SwiftUI 图表&#xff0c;这使得在 SwiftUI 视图中创建图表变得异常简单。图表是以丰富的格式呈现可视化数据的一种很好的方式&#xff0c;而且易于理解。本文展示了如何用比以前从头开始创建同样的折线图少得多的代码轻松创建折线图。此外&am…

Spring Security环境搭建

Spring Security环境搭建 Spring BootSpring Security 认证&#xff1a;判断用户是否是用户合法用户的过程授权&#xff1a;判断系统用户可以访问或访问哪些权限资源 环境搭建 创建springBoot项目并导入springsecurity相关的依赖。 <dependencies><dependency>…

翻转课堂,让传统的以教为中心变成以学中心

翻转教室的故事起源于2007年&#xff0c;美国科罗拉多州洛矶山林地公园高中 (Woodland Park High School)的化学老师Jon Bergmann 和Aaron Sams&#xff0c;为了解决同学的缺课&#xff0c;先将预录好的课程上传到YouTube网站&#xff0c;让学生自行上网浏览学习。 他们发现学…

YOLO物体检测系列1.经典方法概述及评价指标体现

1. 深度学习经典检测方法&#xff1a; two-stage(两阶段)&#xff1a; Faster-rcnn Mask-RCNN系列 one-stage(单阶段)&#xff1a;Yolo系列 两阶段&#xff1a;一阶段实现RPN候选区域预选 二阶段基于候选区域再进行检测回归分类任务 单阶段&#xff1a;一个CNN卷积网络实现检测…

Ficus: 一款 markdown 编辑管理软件

Ficus Ficus 是一款 markdown 文档的编辑管理软件&#xff0c;由 ggG 团队开发。 Ficus 释义为“榕树”&#xff0c;榕树具有“冠盖如伞、一木成林“的特点。这也恰是本款软件想要为用户提供的核心服务&#xff1a;让用户的 md 文档可以像一棵榕树一样被浏览和编辑&#xff0…

EasyExcel动态头导出

前言 这段时间的项目中需要导出动态表格。 根据所选的参数导出对应的字段内容 下图所示选择下面几个tab页就需要导出对应的表头字段 下面为具体实现的效果。表头样式可以通过EasyExcel 提供的方法自定义。 具体实现 主要是通过 传入 exportItem 这个条件来决定导出的事项…

GCM与CCM的的规格和加解密过程

CCM CCM&#xff08;Counter with CBC-MAC&#xff09;是一种基于对称加密算法的认证加密&#xff08;Authenticated Encryption&#xff09;模式&#xff0c;结合了CBC-MAC&#xff08;Cipher Block Chaining Message Authentication Code&#xff09;用于消息认证和CTR&…

沃通TSA可信时间戳服务,保障电子数据法律效力

在全球信息化的大趋势下&#xff0c;以计算机及其网络为依托的电子数据&#xff0c;在证明案件事实的过程中起着越来越重要的作用&#xff0c;而可信时间戳已成为确立电子数据法律效力的重要技术之一。沃通TSA可信时间戳服务&#xff0c;提供具有法律效力的第三方可信时间戳认证…

android10 关闭默认输入法的“更正建议”

1. 场景 使用系统默认的输入法&#xff0c;在进行输入时&#xff0c;在输入法上方&#xff0c;会显示更正建议列表&#xff0c;同时会干扰我们的输入内容&#xff1a;会自动补全到输入框&#xff0c;而且删除不掉&#xff0c;甚至越删越多&#xff0c;非常讨厌。 如下&#x…

Spring IOC之对象的创建方式、策略及销毁时机和生命周期且获取方式

目录 一、对象的创建方式 1. 使用构造方法 2. 使用工厂类方法 3. 使用工厂类的静态方法 二、对象的创建策略 1. 单例策略 2. 多例策略 三、对象的销毁时机 四、生命周期方法 1. 定义生命周期方法 2. 配置生命周期方法 3. 测试 五、获取Bean对象的方式 1. 通过id/…

学习ZLmediaKit流媒体服务器时候遇到的问题

照zlmediakit的源码 自己复制了一份 然后有的地方编译不过修改了部分 测试的时候发现有两个问题 第一是 ffmpeg的ffplay 能播放 vlc不能播放 第二个问题是directProxy设置为0的时候 推流的时候 然后用ffplay播放 只有音频没有视频 查了好久终于解决这个问题 第一个…

pytest 自动化框架搭建-生成一个报告(alluer)

简单的case跑通了&#xff0c;尝试生成报告 1、使用allure-pytest 安装pip3 install allure-pytest 2、使用--alluredir../allure-results 如下我是直接在pytest.ini文件中使用命令 如下生成文件夹和json格式的文件 二、生成allure报告 1、安装allure 我是使用的命令直接…