学习虚幻C++开发日志——TArray

TArray

官方文档:Array Containers in Unreal Engine | 虚幻引擎 5.4 文档 | Epic Developer Community (epicgames.com)

TArray是虚幻引擎中最简单的容器类,其底层是动态数组。

TArray、TMap、TSet三者都被称为同质容器(其所有元素均完全为相同类型)

注意:勿使用 新建(new) 和 删除(delete) 创建或销毁 TArray 实例

TArray文件位于core->Public->Containers->Array.h(动态数组模板)

1.1创建和填充数组

1.1.1填充TArray的方法——Init函数

使用 Init 函数,将大量元素副本填入数组。

先创建Actor类(具体步骤省略)

Actor类头文件增添代码:

public:
  UFUNCTION(BlueprintCallable)//暴露给蓝图
  void InitIntArray();

  UFUNCTION(BlueprintCallable)//暴露给蓝图
  void AddStrIntArray();

源文件函数代码:

void Actor::InitIntArray()
{
    TArray<int32> IntArray1;//创建数组将以此定义
    TArray<int32> IntArray2;

    //声明int32接收数组元素以及其所占据的大小
    int32 ArrayNum=IntArray1.Num();
    int32 ArraySize=InteArray1.GatAllocatedSize();

    //对数组简单初始化
    IntArray1.Init(10, 5);//IntArray1 == [10,10,10,10,10]
    IntArray2={1,2,3,4,5,6};

    //再次获取
    ArrayNum=IntArray1.Num();
    ArraySize=InteArray1.GatAllocatedSize();
}


void Actor::AddStrIntArray()//创建新函数在数组增加元素
{
    	TArray<FString> StrArr;//声明String类型的Arr
		StrArr.Add    (TEXT("Hello"));
		StrArr.Emplace(TEXT("World"));
}

int32是占4个字节整形数值

Add 和 Emplace 函数的多数效果相同,细微区别在于:

  • Add(或 Push)将元素类型的实例复制(或移动)到数组中。
  • Emplace 使用给定参数构建元素类型的新实例。

在 TArray<FString> 中,Add 将用字符串文字创建临时 FString,然后将该临时 FString 的内容移至容器内的新 FString 中;而 Emplace 将用字符串文字直接新建 FString。最终结果相同,但 Emplace 可避免创建临时文件。对于 FString 等非浅显数值类型而言,临时文件通常有害无益(增加性能损耗)。

总而言之Emplace 的效率始终高于 Add,但 Add 的可读性可能更好。

注意:在VS编辑器中用DebugGame Editor方式启动测试,不要用Development启动则变量会被优化无法查看。

1.1.2填充TArray的方法——Add和Emplace函数

Add 和 Emplace 函数用于在数组末尾新建对象

接着上面的头文件:

//先创建一个结构体
USTRUCT()
STRUCT NameAddStructInfo
{
    GENERATED_BODY()
public:

    NameAddStructInfo()
    {
        UE_LOG(LogTemp,Warning,TEXT("被初始化了1"));//打印日志用于测试
    }

    NameAddStructInfo(int32 InHealth):Healty(InHealth)
    {
        UE_LOG(LogTemp,Warning,TEXT("被初始化了2"));//打印日志用于测试
    }

    ~NameAddStructInfo()
    {
        UE_LOG(LogTemp,Warning,TEXT("被释放了"));//打印日志用于测试
    }

    int32 Healty=100;
};

Actor类头文件增添代码:

public:
  UFUNCTION(BlueprintCallable)//暴露给蓝图
  void AddStructArray();

  UFUNCTION(BlueprintCallable)//暴露给蓝图
  void EmplaceStructArray();

  TArray<NameAddStructInfo> StructArray;//把数组声明到对象里面

源文件函数代码:

void Actor::AddStructArray()
{
    StructArray.Add(150);
}

void Actor::EmplaceStructArray()
{
    StructArray.Emplace(200);
}

由日志结果可知Add函数构建了临时对象,在前一步过程完成后移动或拷贝到StructArray里面,然后临时对象被释放了。而Emplace函数是直接构建对象到StructArray里面,直到游戏结束时才被释放。

1.1.3填充TArray的方法——Append

利用 Append 可一次性添加其他 TArray 中的多个元素,或者指向常规C数组的指针及该数组的大小(一般用来字符串的拼接)

Actor类头文件增添代码:

public:
    UFUNCTION(BlueprintCallable)//暴露给蓝图
     TArray<FString> AppendStrArray()

源文件函数代码:

 TArray<FString> Actor::AppendStrArray()
{
        FString Arr[] = { TEXT("of"), TEXT("Tomorrow") };
        TArray<FString>StrArr;
		StrArr.Append(Arr, UE_ARRAY_COUNT(Arr));
        //注意输出先后顺序
        StrArr.Add    (TEXT("Hello"));
		StrArr.Emplace(TEXT("World"));
		// StrArr == ["Hello","World","of","Tomorrow"]

        return StrArr;
}

1.1.4填充TArray的方法——AddUnique

仅在尚不存在等值元素时,AddUnique 才会向容器添加新元素。(一般用在重复性情况下)

Actor类头文件增添代码:

public:
    UFUNCTION(BlueprintCallable)//暴露给蓝图
    void AddUniqueString();

源文件函数代码:

void Actor::AddUniqueString()
{
    TArray<FString>StrArr=AppendStrArray();//此做法会产生耦合

	StrArr.AddUnique(TEXT("!"));
	// StrArr == ["Hello","World","of","Tomorrow","!"]

	StrArr.AddUnique(TEXT("!"));
	// StrArr is unchanged as "!" is already an element
	 
}

1.1.5填充TArray的方法——Insert

Insert 将在给定索引处添加单个元素或元素数组的副本(给定位置具体插入)

Actor类头文件增添代码:

public:
    UFUNCTION(BlueprintCallable)//暴露给蓝图
    void InsertString();

源文件函数代码 :

void Actor::InsertString()
{
    TArray
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值