虚幻引擎基础入门(C++) — 【容器篇 05】

前言


容器是方便存储数据的载体,虚幻提供了三种同质容器(只能用来存储相同类型的数据):

TArray(只有TArray可以使用UPROPERTY宏说明)
TMap
TSet


一、TArray


TArray是UE中的数组类型,速度快,内存消耗小,安全性高。

1、初始化构建与元素遍历**

void AMyGameModeBase::BeginPlay()
{
    //1.容器在初始化构建时,直接构建为栈对象,不要new为堆对象!
    TArray<FString> Array;
    
    //2.使用初始化函数添加元素(10个“牛逼”)
    Array.Init(TEXT("牛逼"), 10);

    //3.遍历元素: Num()获取TArray当前元素个数
    for (int32 i = 0; i < Array.Num(); i++)
    {
        UE_LOG(LogTemp, Log, TEXT("%s"), *Array[i]);
    }

    //3.新语法进行遍历
    for (auto& i : Array)
    {
        UE_LOG(LogTemp, Log, TEXT("NEW: %s"), *i);
    }
}
2、 添加元素
void AMyGameModeBase::BeginPlay()
{
    //从之前初始化创建的10个元素的数组,添加3条,又接一个长度3的数组,变成16个元素

    //4.Add()添加元素到数组末尾,返回当前添加元素在数组中的下标
    int32 Array_A = Array.Add(TEXT("你爹"));

    //5.Emplace()添加元素到数组末尾,返回下标
    Array.Emplace(TEXT("你爹1"));

    //6.AddUnique()只添加数组中没有的元素,如果数组中已存在该元素,则返回该元素在数组中的下标。
    Array.AddUnique(TEXT("你爹2"));

    //7.Append()复制普通数组到TArray容器中
    //ARRAY_COUNT(NewArray)获取新数组长度
    FString NewArray[3]{ TEXT("我是新数组") };
    Array.Append(NewArray, ARRAY_COUNT(NewArray));
}
3、 插入元素
void AMyGameModeBase::BeginPlay()
{
    //8.Insert(要插入的元素内容, 插入的数组下标位置)
    //如果插入位置超过容器的大小,将会报错
    //插入后元素依次向后排列,数组长度+1
    Array.Insert(TEXT("插入元素"), 5);
}
4、 设置容器的大小
void AMyGameModeBase::BeginPlay()
{
    //9.SetNum函数,用来设置容器的大小
    TArray<int32>NewArray;
    NewArray.SetNum(20);
}
5、 迭代器
void AMyGameModeBase::BeginPlay()
{
    //10.迭代器(设计模式):不允许修改元素个数、添加、移除
    //① 创建只读迭代器,只能读取
    for (auto i = Array.CreateConstIterator(); i; ++i)
    {
        UE_LOG(LogTemp, Log, TEXT("%s"), **i);
    }

    //② CreateIterator()创建迭代器函数,可以通过迭代器修改元素内容
    for (auto i = Array.CreateIterator(); i; ++i)
    {
        //修改Array元素
        *i = FString(TEXT("改个元素内容"));
        UE_LOG(LogTemp, Log, TEXT("%s"), **i);
    }
}
6、转成普通数组
void AMyGameModeBase::BeginPlay()
{
    //11.转成普通数组
    //返回类型指针,指针地址是数组中第一个元素的地址
    FString* NewArray = Array.GetData();
}
7、常规查询函数
void AMyGameModeBase::BeginPlay()
{//11.常规查询函数
    //① IsValidIndex():数组在该下标中的元素是否有效,返回布尔值
    Array.IsValidIndex(5);

    //② Last():返回容器中最后一个元素
    //   Last(3):返回容器中倒数第三个元素
    //   Top():返回容器中第一个元素
    Array.Last();
    Array.Last(3);
    Array.Top();

    //③ Contains():包含,返回布尔值
    Array.Contains(TEXT("牛"));

    //④ Find():查询,返回该元素在数组中的下标(没有则返回-1)
    Array.Find(TEXT("牛逼"));

    //查询给定元素所在位置,将位置索引设置到Index,返回布尔值
    //(即能返回布尔,也会返回元素所在位置)
    int Index = 0;
    Array.Find(TEXT("牛逼"), Index);
}
8、常规移除函数
void AMyGameModeBase::BeginPlay()
{
    //12.常规移除函数
    //① 在容器中移除给定元素,返回移除的元素个数
    int32 RemoveNum = Array.Remove(TEXT("牛逼"));

    //② 移除容器中找到的第一个给定元素
    //(返回1表示移除成功,返回0则说明容器中没有这个元素)
    int32 RemoveIndex = Array.RemoveSingle(TEXT("牛逼"));

    //③ 移除给定下标位置的元素
    Array.RemoveAt(2);

    //④ 清空容器
    Array.Empty();
}

二、TMap

  1. 关联型容器,存储对象均有一个关联值,通过键值可以高效的进行对象访问
  2. Map的结构例如钥匙和锁,一把钥匙找一把锁,他们之间是对应的关系
  3. 映射被销毁时,其元素也将被销毁
  4. 键类型必须为值类型,不能使用指针
1、 初始化构建、添加元素与元素遍历
void AMyGameModeBase::BeginPlay()
{
    //1.初始化构建容器,键值类型为FString,数据类型为int32
    TMap<FString, int32>Map;
    
    //2.添加元素
    //注意:添加Map容器中已有的键值,会覆盖之前键值对应的元素
    Map.Add(TEXT("K1"), 111);

    //添加元素时,只添加键值会使用默认元素值
    Map.Add(TEXT("K2"));

    //可以用这种方法修改数据内容,但不能添加
    Map[TEXT("K2")] = 222;

    //3.Append()合并元素
    //将NewMap中的键值和对应元素,复制到Map
    TMap<FString, int32>NewMap;
    Map.Append(NewMap);

    //4. 元素遍历
    for(auto& Item : Map)
    {
        Item.Key;  //获取键值
        Item.Value;  //获取元素
        UE_LOG(LogTemp, Log, TEXT("% s,%d"), *Item.Key, Item.Value);
    }
}
3、 查询函数
void AMyGameModeBase::BeginPlay()
{//6.查询函数
    //① 查询容器中元素个数
    Map.Num();

    //② 是否包含
    Map.Contains(TEXT("111"));

    //③ 返回键值对应的元素指针,如果没找到内容则返回空指针
    Map.Find(TEXT("222"));
}
4、移除函数
void AMyGameModeBase::BeginPlay()
{//7.移除函数
    //① 使用给定键值移除元素
    Map.Remove(TEXT("K1"));

    //② 清空容器
    Map.Empty();
}

三、TSet

  1. 也是键值容器(和TMap类似),但速度快,无需提供单独的键进行关联元素,不允许有重复的键
  2. TSet是KV容器,不保证数据填充顺序。
  3. TSet数据存储时无法重复存储,TArray可以
1、初始化构建、添加元素与元素遍历
void AMyGameModeBase::BeginPlay()
{
    //1.初始化构建
    TSet<FString>Set1;

    //2.添加元素
    Set1.Add(TEXT("哟西"));

    //3.允许合并操作
    TSet<FString>Set2;
    Set1.Add(TEXT("斯国一"));
    Set2.Append(Set1);  //将Set1中元素复制一份添加到Set2中

    //4.元素遍历
    for (auto& Item : Set2)
    {
        UE_LOG(LogTemp, Log, TEXT("%s"), *Item);
    }
}
2、迭代器
void AMyGameModeBase::BeginPlay()
{//5.普通迭代器
    for (auto Item = Set1.CreateIterator(); Item; Item++)
    {
    }

    //6.只读迭代器
    for (auto Item = Set1.CreateConstIterator(); Item; Item++)
    {
        *Item;  //获取内容,禁止修改
    }
}
3、查询函数
void AMyGameModeBase::BeginPlay()
{//7.获取容器中元素类型
    Set1.Num();

    //8.检查元素中是否包含给定的键值
    Set1.Contains(TEXT("西"));

    //9.如果查找某一元素是否存在,可直接使用Find进行单一查找,返回找到指向元素的指针,没找到则返空
    Set1.Find(TEXT("西"));

    //10.将TSet容器转为TArray容器
    Set1.Array();
}
4、移除函数
void AMyGameModeBase::BeginPlay()
{//11.移除给定键值内容,成功返回1,失败返回0
    Set1.Remove(TEXT("西"));

    //12.移除所有元素,释放空间
    Set1.Empty();

    //13.移除元素,但不释放空间
    Set1.Reset();
}

总结

以上就是今天要讲的内容,本文仅仅简单介绍了虚幻引擎中容器的使用。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值