首页 > 编程语言 >UEC++ 容器:TArray

UEC++ 容器:TArray

时间:2022-09-19 12:24:56浏览次数:70  
标签:容器 TEXT 元素 C++ TArray UE Array LogTemp Hello

说明:容器是方便我们存储数据的载体,在虚幻中,为我们提供了三种容器。分别是TArray,TMap,TSet。首先虚幻提供的容器都是同质容器,只能用来存储相同类型的数据。三种容器具备不同的特性,针对不同的特性,我们可以根据使用场景选择操作的容器。

并且在虚幻定义了丰富的API供开发者使用

注意:在使用这三种容器的时候需要注意,只有TArray可以使用UPROPERTY宏说明

TArray

  • 最常用的数据容器,特点速度快,内存消耗小,安全性高。
  • TArray被称为同质容器:其所有元素均完全为相同类型。不能进行不同元素类型的混合
  • TArray被设计成值类型,无法被继承,不要使用new和delete在堆上进行创建销毁。元素也是数值类型,为容器拥有。TArray被销毁时元素也被销毁。从一个TArray创建新的TArray变量,将把元素复制到新的变量中,不存在共享状态。

初始化:

注意事项:容器在构建时,不要构建为堆对象!直接构建为栈对象!由于容器是模版类,在构建时必须指出存储数据类型。

  // 容器需要构建为栈对象类型
    TArray<FString> Array; 
     //向容器添加5个元素,且值均为 Hello!
    Array.Init(TEXT("Hello!"), 5);

遍历数组:

  • Num函数可以获取TArray当前元素个数。TArray重载了运算符[],通过位置下标可以访问到对应位置元素
    for (int i = 0; i < Array.Num(); i++) {
        UE_LOG(LogTemp, Log, TEXT("第%d值是:%s"),i,*Array[i]);
    }

输出结果:

LogTemp: 第0值是:Hello!
LogTemp: 第1值是:Hello!
LogTemp: 第2值是:Hello!
LogTemp: 第3值是:Hello!
LogTemp: 第4值是:Hello!

  • 借助新语法进行遍历
    for (auto& val : Array) {
        UE_LOG(LogTemp, Log, TEXT("%s"), *val);
    }

输出结果:

LogTemp: Hello!
LogTemp: Hello!
LogTemp: Hello!
LogTemp: Hello!
LogTemp: Hello!

添加元素:

  • Add,Emplace,AddUnique函数均可向数组中添加元素(到末尾),元素被添加时,内存从分配器中被分配。Add和Emplace函数可达到同样的效果,但是存在细微不同。
  • Add函数将把一个元素类型实例复制(或移动)到数组中
  • Emplace添加元素到容器中,Add函数调用的是Emplace函数
  • AddUnique向容器中加入唯一元素,如果元素已经存在,则返回重复元素的位置
    Array.Add(TEXT("Add01"));
    Array.Emplace(TEXT("Add02"));
    Array.AddUnique(TEXT("Add02"));
    Array.AddUnique(TEXT("Add03"));

输出结果:

LogTemp: 第0值是:Hello!
LogTemp: 第1值是:Hello!
LogTemp: 第2值是:Hello!
LogTemp: 第3值是:Hello!
LogTemp: 第4值是:Hello!
LogTemp: 第5值是:Add01
LogTemp: 第6值是:Add02
LogTemp: 第7值是:Add03

上面我们利用AddUnique又添加了一次Add02但是这里只有一个Add02;

Append:

  • Append函数可以复制普通的数组到容器中
  • 第一个参数,普通数组,第二个参数数组中元素的个数
    FString StrArr[3]{ "1","2","3" };
    Array.Append(StrArr, ARRAY_COUNT(StrArr));

输出结果:

LogTemp: 第0值是:Hello!
LogTemp: 第1值是:Hello!
LogTemp: 第2值是:Hello!
LogTemp: 第3值是:Hello!
LogTemp: 第4值是:Hello!
LogTemp: 第5值是:1
LogTemp: 第6值是:2
LogTemp: 第7值是:3

Insert插入元素:

  • 允许在给定索引添加一个单一元素或元素数组的一个副本。
  • 如果插入位置超过容器的大小,将会报错!
    Array.Insert(TEXT("ins01"), 3);

输出结果:

LogTemp: 第0值是:Hello!
LogTemp: 第1值是:Hello!
LogTemp: 第2值是:Hello!
LogTemp: 第3值是:ins01
LogTemp: 第4值是:Hello!
LogTemp: 第5值是:Hello!

SetNum:

主动设置容器的大小,如果长度大于原容器大小,空白位置将用模版类型默认对象填充。如果小于原容器大小,则超过设置大小的内容将被删除。

函数原型:第一个参数容器的大小,第二个是允许缩小容器当前元素数量

void SetNum(SizeType NewNum, bool bAllowShrinking = true)

使用:

Array.SetNum(3,true);

当你已经初始化过数组,但在后面又使用了 SetNum 且设置的长度比原长度小的时,数组会自动将超出的截去

如果设置的长度大于原长度,那么超出的部分就会被赋值为空

迭代器:

  • 迭代器(iterator)有时又称游标(cursor)是程序设计的软件设计模式,可在容器(container,例如链表或阵列)上遍访的接口,设计人员无需关心容器的内容。
  • TArray有两种迭代器,一种是可以通过迭代器更改元素内容,一种是只能读取元素不能修改元素。
  • 禁止在迭代器中修改容器的元素个数,禁止添加和移除元素
    for (auto It = Array.CreateIterator();It; ++It)
    {
        // *It用来读取数据
        *It = FString(TEXT("cg01")); // 可以修改元素内容
        UE_LOG(LogTemp, Log, TEXT("%s"), **It);
    }
    for (auto It = Array.CreateConstIterator(); It; ++It)
    {
        // *It用来读取数据
        *It = FString(TEXT("cg01")); // 禁止修改元素内容
        UE_LOG(LogTemp, Log, TEXT("%s"), **It);
    }

输出结果:

LogTemp: 第0值是:cg01
LogTemp: 第1值是:cg01
LogTemp: 第2值是:cg01
LogTemp: 第3值是:cg01
LogTemp: 第4值是:cg01

转成普通数组:

返回类型指针,指针地址是数组中第一个元素的地址

FString* StrData = Array.GetData();

常规查询函数:

    // 查询指定位置是否存在有效元素,返回布尔值
    Array.IsValidIndex(3);
    Array.Last();// 返回最后的元素
    Array.Last(3);// 返回倒数第三个元素
    Array.Top(); // 返回顶端元素
    // 检查是否包含给定的元素 返回布尔值
    Array.Contains(TEXT("Hello!"));
    // 查找是否包含给定的元素,并返回元素所在的位置,不包含返回-1
    Array.Find(TEXT("Hello!"));
    // 查找是否包含给定的元素,将位置索引设置到Index,返回布尔值
    int Index = 0;
    Array.Find(TEXT("Hello!"), Index)

常规移除函数:

TArray有Reset函数,清除内容,但保留空间

    // 在容器中移除给定的元素,返回移除的个数
    Array.Remove(TEXT("Hello!"));
    // 移除数组中首个给定元素,成功返回1,失败返回0
    Array.RemoveSingle(TEXT("Hello!")); 
    Array.RemoveAt(3); // 返回给定位置的元素
    Array.Empty(); // 清空容器

 

 

标签:容器,TEXT,元素,C++,TArray,UE,Array,LogTemp,Hello
From: https://www.cnblogs.com/limu-zy/p/16706887.html

相关文章

  • 接口测试-requests
    引言:你是如何做接口自动化的,用的工具于技术有哪些?2个维度:工具:postman、jmeter代码:requests一、Requests概述Requests在官方的文档中,有这么介绍的⼀句话,具体为:HTTPFo......
  • JQuery 操作指南_1
    $(this).hide()演示jQueryhide()函数,隐藏当前的HTML元素。$("#test").hide()演示jQueryhide()函数,隐藏id="test"的元素。$("p").hide()......
  • 基于.NetCore + Quartz.Net + Vue + IView开箱即用的定时任务UI
    基于.NetCore+Quartz.Net+Vue+IView开箱即用的定时任务UI。不依赖数据库,只需在界面做简单配置。地址:https://github.com/cq-panda/Quartz.NetUI ......
  • C++编译
    为什么需要编译:编写好的代码最终翻译为机器可执行的二进制指令,编译的过程如下图所示:  编译预处理:在预编译过程中主要处理源代码中的预处理指令。引入头文件#include......
  • UEC++ 数据类型
    禁止在UE中使用C++的基本数据类型,这样会影响引擎的跨平台特性1、基本数据类型bool代表布尔值(永远不要假设布尔值的大小)。BOOL将不会进行编译。TCHAR代表字符型......
  • C#封装FluentValidation
    FluentValidation是一个非常强大的用于构建强类型验证规则的.NET框架,帮程序员解决了繁琐的校验问题,用起来非常爽,但我还是遇到了一件非常不爽的事情,如下代码所示:publi......
  • C++定义变量与生存周期
    作用域:作用域即一个变量可以被引用的范围,常见的作用域可分为6种:全局作用域,局部作用域,语句作用域,类作用域,命名空间作用域和文件作用域。全局变量:具有全局作用域。全局变......
  • jQuery伪造post请求
     导出使用场景:当前端需要传非常多的参数数据,就需要用到post导出get请求:window.location.href="/CustomOrder/MapRowLinePlan/PlanUseCommunityDown?appCode=CTMS&dat......
  • 使用Vite快速构建Vue3+ts+pinia脚手架
    一、前言vue3的快速更新,很多IT发展快的地区在22开始都已经提上日程,小编所在的青岛好像最近才有点风波。vue3的人才在青岛还是比较稀缺的哈,纯属小编自己的看法,可能小编是个......
  • 基于electron+vue+element构建项目模板之【改造项目篇】
    1、概述开发平台OS:windows开发平台IDE:vscode上一篇中已完成了electron-vue项目的创建,本篇章中则介绍在此项目基础上进行取消devtools的安装、项目结构的改造、环境变量......