ue中特有容器的使用
1、Log日志宏
输出到屏幕上的调试日志会覆盖,在output log窗口则可以全部显示,所以先写个打日志的宏
DECLARE_LOG_CATEGORY_EXTERN(MyContaimTest, Log, All);
DEFINE_LOG_CATEGORY(MyContaimTest)
//调试日志
UE_LOG(MyContaimTest, Warning, TEXT("--- index:%d, value:%s "),i, *_arr[i]);
2、TArray的几种遍历
auto printFunc1 = [&](TArray& _arr)->void{
for (int32 i = 0; i < _arr.Num(); i++)
{
//FString str = FString::Printf(TEXT("--- index:%d, value:%s "), i, *_arr[i]);
//GEngine->AddOnScreenDebugMessage(0, 3.0f, FColor::Red, str);
UE_LOG(MyContaimTest, Warning, TEXT("--- index:%d, value:%s "),i, *_arr[i]);
}
};
auto printFunc2 = [&](TArray& _arr)->void {
for (const FString& val : _arr)
{
UE_LOG(MyContaimTest, Warning, TEXT("--- value111:%s"), *val);
}
};
auto printFunc3 = [&](TArray& _arr)->void {
for (TArray::TConstIterator iter = _arr.CreateConstIterator(); iter; ++iter)
{
UE_LOG(MyContaimTest, Warning, TEXT("--- value222:%s"), *(*iter));
}
};
3、TArray 增
// 创建一个数组
TArray IntArray;
// 通过同一个元素填充初始化
IntArray.Init(10, 5);
// IntArray == [10, 10, 10, 10, 10]
// 增加新元素
// Add会引入临时对象,优先使用Emplace
TArray StrArr;
StrArr.Add(TEXT("Hello"));
StrArr.Emplace(TEXT("World"));
// StrArr == ["Hello", "World"]
//printFunc1(StrArr);
// 追加多个元素
FString Arr[] = { TEXT("of"), TEXT("Tomorrow") };
StrArr.Append(Arr, ARRAY_COUNT(Arr));
// StrArr == ["Hello", "World", "of", "Tomorrow"]
//printFunc1(StrArr);
// 只有容器中不存在该元素的时候,才添加
StrArr.AddUnique(TEXT("!"));
// StrArr = ["Hello", "World", "of", "Tomorrow", "!"]
//printFunc1(StrArr);
StrArr.AddUnique(TEXT("!"));
// StrArr没有变
//printFunc1(StrArr);
// 插入
StrArr.Insert(TEXT("Brave"), 1);
// StrArr == ["Hello","Brave","World","of","Tomorrow","!"]
//printFunc1(StrArr);
// 直接设置数组的元素个数
// 如果大于当前值,那么使用元素类型的默认构造函数创建新元素
// 如果下雨当前值,相当于删除元素
StrArr.SetNum(8);
// StrArr == ["Hello","Brave","World","of","Tomorrow","!","",""]
//printFunc1(StrArr);
StrArr.SetNum(6);
// StrArr == ["Hello","Brave","World","of","Tomorrow", "!"]
//printFunc1(StrArr);
//printFunc2(StrArr);
//printFunc3(StrArr);
4、TArray 排序
// 排序(快排序,不稳定的)
// 默认按照operator <
StrArr.Sort();
// StrArr == ["!","Brave","Hello","of","Tomorrow","World"]
// 自定义排序规则
StrArr.Sort([](const FString& A, const FString& B) {
return A.Len() < B.Len();
});
// StrArr == ["!","of","Hello","Brave","World","Tomorrow"]
//printFunc1(StrArr);
// 堆排序(也不稳定的)
StrArr.HeapSort([](const FString& A, const FString& B) {
return A.Len() < B.Len();
});
// StrArr == ["!","of","Brave","Hello","World","Tomorrow"]
//printFunc1(StrArr);
// 合并排序(稳定的)
StrArr.StableSort([](const FString& A, const FString& B) {
return A.Len() < B.Len();
});
// StrArr == ["!","of","Brave","Hello","World","Tomorrow"]
//printFunc1(StrArr);
5、TArray 查
// 查询
// 数量
int32 Count = StrArr.Num();
// Count == 6
// 直接访问
// 如果容器是const,那么返回的指针也是const的
FString* StrPtr = StrArr.GetData();
// StrPtr[0] == "!"
// StrPtr[1] == "of"
// ...
// 一个元素的大小
uint32 ElementSize = StrArr.GetTypeSize();
// ElementSize == sizeof(FString)
// 判断索引
bool bValidM1 = StrArr.IsValidIndex(-1);
// bValidM1 == false
// operator[] 返回索引
//StrArr[3] = StrArr[3].ToUpper();
// StrArr == ["!","of","Brave","HELLO","World","Tomorrow"]
// 从后面访问
FString ElemEnd = StrArr.Last();
FString ElemEnd0 = StrArr.Last(0);
FString ElemEnd1 = StrArr.Last(1);
FString ElemTop = StrArr.Top();
// ElemEnd == "Tomorrow"
// ElemEnd0 == "Tomorrow"
// ElemEnd1 == "World"
// ElemTop == "Tomorrow"
// 查询是否存在某元素
bool bHello = StrArr.Contains(TEXT("Hello"));
bool bGoodbye = StrArr.Contains(TEXT("Goodbye"));
// bHello == true
// bGoodbye == false
// 自定义查询规则
bool bLen5 = StrArr.ContainsByPredicate([](const FString& Str) {
return Str.Len() == 5;