UE常用容器之TSet

TSet 是一种快速容器类,使用数据值本身作为键。

示例代码如下:

//=========================================================================================
//初始化
TSet<FString> FoodSet;

//=========================================================================================
//增
// 使用 Add 或 Emplace 添加元素。
FoodSet.Add(TEXT("Banana"));
FoodSet.Add(TEXT("Apple"));
FoodSet.Emplace(TEXT("Orange"));
// ==> FoodSet == [ "Banana", "Apple", "Orange" ]

// 使用 Append 函数来插入另一个集合中的所有元素。
// 存在 NewFoodSet == [ "Cake", "Cola", "Orange" ]
FoodSet.Append(NewFoodSet);
// ==> FoodSet == [ "Banana", "Apple", "Orange", "Cake", "Cola" ]

//=========================================================================================
//删
// 存在 FoodSet == [ "Banana", "Apple", "Orange", "Cake", "Cola" ]

// 使用 Remove 函数可按索引移除元素。
int RemovedCount = FoodSet.Remove(TEXT("Apple")); // ==> RemovedCount == 1
// ==> FoodSet == [ "Banana", <invalid>, "Orange", "Cake", "Cola" ]

int RemovedCount = FoodSet.Remove(TEXT("Apple")); // ==> RemovedCount == 0
// ==> FoodSet == [ "Banana", <invalid>, "Orange", "Cake", "Cola" ]

// 使用 Empty 或 Reset 函数可将集合中的所有元素移除。
FoodSet.Reset();
// ==> FoodSet == [ <invalid>, <invalid>, <invalid>, <invalid>, <invalid> ]

FoodSet.Empty();
// ==> FoodSet == []

//=========================================================================================
//改
//排序
// 存在 FoodSet == [ "Apple", "Orange", "Cake", ]
FoodSet.Sort([](const FString& A, const FString& B) {
    return A > B;
});
// ==> FoodSet == [ "Apple", "Cake", "Orange"]

FoodSet.Sort([](const FString& A, const FString& B) {
    return A.Len() > B.Len();
});
// ==> FoodSet == [ "Orange", "Apple", "Cake"]

//内存
// 使用 Reserve 函数可直接创建 slack,在添加元素之前预分配内存。
TSet<int32> IntSet;
IntSet.Reserve(4); // ==> IntSet == [ <invalid>, <invalid>, <invalid>, <invalid> ]
// 使用 Shrink 函数可移除 TSet 中的全部 slack。
IntSet.Shrink(); // ==> IntSet == []

// 存在 FoodSet == [ "Apple", <invalid>, "Orange", <invalid>, "Cake", <invalid>]
// 使用 Compact 或 CompactStable 函数,将空白空间组合在一起,为调用 Shrink 做好准备。
FoodSet.Shrink(); // ==> IntSet == [ "Apple", <invalid>, "Orange", <invalid>, "Cake"]
FoodSet.Compact(); // ==> IntSet == [ "Apple", "Orange", "Cake", <invalid>, <invalid>]
FoodSet.Shrink(); // ==> IntSet == [ "Apple", "Orange", "Cake" ]

//=========================================================================================
//查
// 存在 FoodSet == [ "Banana", "Apple", "Orange", "Cake", "Cola"]

// 使用 Num 函查询集合中保存的元素数量。
int32 Count = FoodSet.Num(); // ==> Count == 5

// 使用 Contains 函数查询是否包含特定元素。
bool bContains = FoodSet.Contains(TEXT("Banana")); // ==> bContains == true
bool bContains = FoodSet.Contains(TEXT("Water"));  // ==> bContains == false

// 使用 FSetElementId 结构体可查找集合中某个键的索引。
// 使用运算符 [] 查找元素。
FSetElementId Index = FoodSet.Index(TEXT("Banana")); // ==> FoodSet[Index] == TEXT("Banana")
FSetElementId Index = FoodSet.Index(TEXT("Water"));  // ==> FoodSet[Index] Assert

// 使用 Find 返回指向元素数值的指针。
FString* Ptr = FoodSet.Find(TEXT("Banana")); // ==> *Ptr == TEXT("Banana")
FString* Ptr = FoodSet.Find(TEXT("Water"));  // ==> Ptr == nullptr

// 使用 Array 函数会返回一个 TArray,其中填充了 TSet 中每个元素的一份副本。
TArray<FString> FoodArray = FoodSet.Array();
// FoodArray == [ "Banana","Apple","Orange","Cake","Cola" ]

//遍历
// auto遍历。
for (auto& Elem : FoodSet)
{
	Elem; // 遍历的值。
}

// 迭代器遍历。
// CreateIterator 返回拥有读写访问权限的迭代器,
// CreateConstIterator 返回拥有只读访问权限的迭代器
for (auto It = FoodSet.CreateConstIterator(); It; ++It)
{
    *it;	// 遍历的值。
}


//=========================================================================================
//运算
// 存在 FoodSetA == [ "Orange", "Apple", "Cake"]
// 存在 FoodSetB == [ "Banana", "Apple", "Cola"]

// 使用 Intersect 求交集。
TSet<FString> FoodSetC = FoodSetA.Intersect(FoodSetB); // ==> FoodSetC == [ "Apple" ]

// 使用 Union 求并集。
TSet<FString> FoodSetD = FoodSetA.Union(FoodSetB); // ==> FoodSetD == [ "Orange", "Apple", "Cake", "Banana", "Cola" ]

// 使用 Difference 求差集,返回 this set 不在 other set 里的集合。
TSet<FString> FoodSetE = FoodSetA.Difference(FoodSetB); // A不在B里 ==> FoodSetD == [ "Orange", "Cake" ]
TSet<FString> FoodSetF = FoodSetB.Difference(FoodSetA); // B不在A里 ==> FoodSetD == [ "Banana", "Cola" ]

// 存在 IntSetA == [ 1,2,3,4 ]
// 存在 IntSetB == [ 1,2,3,4,5,6,7,8,9 ]
// 使用 Includes 计算 this set 是否包含 other set。
bool Includes = IntSetA.Includes(IntSetB); // ==> Includes == false
bool Includes = IntSetB.Includes(IntSetA); // ==> Includes == true

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值