前言
容器是方便存储数据的载体,虚幻提供了三种同质容器(只能用来存储相同类型的数据):
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
- 关联型容器,存储对象均有一个关联值,通过键值可以高效的进行对象访问
- Map的结构例如钥匙和锁,一把钥匙找一把锁,他们之间是对应的关系
- 映射被销毁时,其元素也将被销毁
- 键类型必须为值类型,不能使用指针
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
- 也是键值容器(和TMap类似),但速度快,无需提供单独的键进行关联元素,不允许有重复的键
- TSet是KV容器,不保证数据填充顺序。
- 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();
}
总结
以上就是今天要讲的内容,本文仅仅简单介绍了虚幻引擎中容器的使用。