阿赵UE引擎C++编程学习笔记——常用容器TArray、TMap和TSet

  大家好,我是阿赵
  这次来熟悉一下UE引擎在写C++时的一些特定的容器。
主要有三种,分别是TArray、TMap和TSet

一、 TArray

  TArray是标准的数组,通过下标来访问内容。数组里面的元素是可以重复的。
  以下是TArray的一些用法举例:

//构造
TArray<int> arr = { 1,2,3,4,5,6,7 };
//添加
arr.Add(8);
//当数组里面没有时添加
arr.AddUnique(7);
//在某个位置插入,注意,第一个参数是插入的值,第二个参数是插入位置,如果插入位置大于长度,会崩溃
arr.Insert(99, 2);
TArray<int> arr2 = { 8,9,9,9,10,11,12 };
//把另外一个TArray拼接进来
arr.Append(arr2);
//删除数组里面的全部某个元素
arr.Remove(9);
//删除数组里面第一个出现符合的元素
arr.RemoveSingle(8);
//删除某个下标位置的元素
arr.RemoveAt(1);

//自定义条件删除元素
arr.RemoveAll([](const int val) {return val < 5; });


//查找第一个出现某个元素的位置
int index = arr.Find(99);
//查找最后一个出现某个元素的位置
int lastIndex = arr.FindLast(99);
//判断数组是否包含某个元素
bool isContain = arr.Contains(99);

//Sort 基于快速排序,是不稳定的排序;
//HeapSort 基于堆排序,是不稳定的排序;
//StableSort 基于归并排序,是稳定的排序。

//从小到大排序
arr.Sort();
//自定义条件排序
arr.Sort([](const int A, const int B)
	{
		return A > B;
	});

arr.HeapSort([](const int A, const int B)
	{
		return A > B;
	});

arr.StableSort([](const int A, const int B)
	{
		return A > B;
	});

//数组长度
UE_LOG(LogTemp, Display, TEXT("num:%d"), arr.Num());
//待分配长度
UE_LOG(LogTemp, Display, TEXT("Slack:%d"), arr.GetSlack());
//数组已申请内存长度
UE_LOG(LogTemp, Display, TEXT("Max:%d"), arr.Max());
//3种遍历
for (int val : arr)
{
	UE_LOG(LogTemp, Display, TEXT("%d"), val);
}

for (int i = 0; i < arr.Num(); i++)
{
	UE_LOG(LogTemp, Display, TEXT("%d"), arr[i]);
}

for (auto it = arr.CreateIterator();it;++it)
{
	UE_LOG(LogTemp, Display, TEXT("%d"), *it);
}

//清空数组,并释放内存
arr.Empty();
//重置数组,但不释放已经申请的内存
arr.Reset();

二、 TMap

  TMap是使用Key和Value配对的字典。
  以下是TMap的用法举例

//构造
TMap<FString,int> map;
//添加或修改元素
map.Add(TEXT("A"), 10);
map.Add(TEXT("B"), 11);
map.Add(TEXT("C"), 12);
map.Add(TEXT("D"), 13);
map.Emplace(TEXT("B"), 20);
	
//修改元素
map.Emplace(TEXT("C"), 16);
//移除元素
map.Remove(TEXT("D"));
//移除某个key,并把值保存下来
int copyVal = 0;
map.RemoveAndCopyValue(TEXT("C"), copyVal);
//判断是否为空
bool isEmpty = map.IsEmpty();
//获取元素个数
int count = map.Num();
UE_LOG(LogTemp, Display, TEXT("num:%d"),count);
//是否包含
bool isContain = map.Contains(TEXT("B"));
//查找某个Key的元素
int32 *index = map.Find(TEXT("B"));
//查找某个Value的元素
const FString *keyIndex = map.FindKey(20);
//查找某个key的元素的引用
int rIndex = map.FindRef(TEXT("B"));

UE_LOG(LogTemp, Display, TEXT("Find:%d:%s:%d"), *index,*(*keyIndex),rIndex);

//合并另外一个TMap
TMap<FString, int> map2;
map2.Add(TEXT("AA"), 101);
map2.Add(TEXT("BB"), 102);
map2.Add(TEXT("CC"), 103);
map.Append(map2);

//将TMap移动到另外一个TMap,原TMap清空
TMap<FString, int> map3;
map3 = MoveTemp(map);


//获取所有key和value的列表
TArray<FString> keys;
TArray<int> values;
map.GenerateKeyArray(keys);
map.GenerateValueArray(values);
//遍历
for (auto& item : map3)
{
	UE_LOG(LogTemp, Display, TEXT("%s:%d"), *item.Key, item.Value);
}

for (auto It = map3.CreateIterator(); It; ++It)
{
	UE_LOG(LogTemp, Display, TEXT("%s:%d"), *It.Key(), It.Value());
}
//清空
map.Empty();
map.Reset();

三、 TSet

  TSet是一种特殊的字典,它不是以下标作为Key,而是用Value本身作为Key。所以TSet里面的元素是不能重复的。
  以下是TSet的用法举例:

//构建
TSet<FString> strSet = { TEXT("a"),TEXT("d") };
//添加元素
strSet.Add(TEXT("c"));
strSet.Add(TEXT("b"));
strSet.Emplace("f");
//由于key就是值,所以重复添加是不会产生2个的
strSet.Add(TEXT("b"));

//把另一个TSet合并,合并后的顺序没有保证
TSet<FString> strSet2 = { TEXT("x"),TEXT("y"),TEXT("n"),TEXT("e") };
strSet.Append(strSet2);

//移除某个值,返回移除的数量,如果没有包含,则返回0
int removeCount = strSet.Remove(TEXT("n"));

strSet.Sort([](const FString& A, const FString& B)
	{
		return A > B;
	});

//是否包含某个元素
bool isContain = strSet.Contains(TEXT("x"));

//查找某个值,如果找不到会返回nullptr
FString* val = strSet.Find(TEXT("r"));
if (val == nullptr)
{
	UE_LOG(LogTemp, Display, TEXT("find:%s"), TEXT("nullptr"));
}
else
{
	UE_LOG(LogTemp, Display, TEXT("find:%s"), *(*val));
}
//转TArray
TArray<FString> strArr = strSet.Array();
//求交集
TSet<FString> strSet3 = strSet.Intersect(strSet2);
//求并集
TSet<FString> strSet4 = strSet.Union(strSet2);
//求strSet不在strSet2里面的元素集合
TSet<FString> strSet5 = strSet.Difference(strSet2);
//判断strSet是否包含strSet2
bool isInclude = strSet.Includes(strSet2);
//遍历
for (auto& item : strSet)
{
	UE_LOG(LogTemp, Display, TEXT("%s"), *item);
}

for (auto It = strSet.CreateIterator(); It; ++It)
{
	UE_LOG(LogTemp, Display, TEXT("%s"), *(*It));
}
//清空
strSet.Empty();
strSet.Reset();
  • 8
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值