【UEC++学习-UE容器之TSet】


TSet

TSet是一种快速容器类,用于在排序不重要的情况下存储唯一元素。

一、创建

二、填充元素

1、Add()Emplace():添加元素

2、Append():添加其他TSet中的多个元素

以上同TArray一样

FruitSet.Add(TEXT("Banana"));
FruitSet.Add(TEXT("Grapefruit"));
FruitSet.Add(TEXT("Pineapple"));

FruitSet.Add(TEXT("Pear"));
FruitSet.Add(TEXT("Banana"));
// FruitSet = [Banana, Grapefruit, Pineapple, Pear]

三、迭代

TMap一样

// auto 范围遍历
for (auto& Elem : FruitSet)
{
    Elem...;
}

// 迭代器迭代
for (auto Iter = FruitSet.CreateIterator(); Iter; ++Iter)	// CreateConstIterator 只读迭代器
{
    *Iter...;
}

四、查询

1、Num():查询TSet元素个数

int32 Count = FruitSet.Num();	// Count = 4 

2、Contanis():查询是否包含某个元素

bool bHasBanana = FruitSet.Contains(TEXT("Banana"));	// bHasBanana = true
bool bHasLemon = FruitSet.Contains(TEXT("Lemon"));		// bHasLemon = false

3、[]Find():查找某个元素

FSetElementId 结构体可查找集合中某个键的索引。然后,就可使用该索引与 运算符[] 查找元素

FSetElementId BananaIndex = FruitSet.FindId(TEXT("Banana"));
FPlatformMisc::LocalPrint(		// 打印 Banana
    *FString::Printf(
        TEXT(" \"%s\"\n"),
        *FruitSet[BananaIndex]
    )
);

FSetElementId LemonIndex = FruitSet.FindId(TEXT("Lemon"));
FPlatformMisc::LocalPrint(		// 报错
    *FString::Printf(
        TEXT(" \"%s\"\n"),
        *FruitSet[LemonIndex]
    )
); 

Find()TMap一样,返回所查找元素的指针,如果不存在,返回nullptr

FString* PtrBanana = FruitSet.Find(TEXT("Banana"));
FString* PtrLemon = FruitSet.Find(TEXT("Lemon"));	// 空指针

4、Array():根据TSet元素返回一个数组

TArray<FString> FruitArray = FruitSet.Array();	// FruitArray = [Banana, Grapefruit, Pineapple, Pear]

五、移除

1、Remove():移除元素

  • 可根据FSetElementId移除指定元素
  • 可根据元素值移除指定元素,返回移除元素个数

2、Empty()Reset():移除全部元素

TMap一样

六、排序

基本同TMap一致

FruitSet.Sort([](const FString& A, const FString& B) {
    return A > B; 
});
// FruitSet = [Pear, Grapefruit, Banana]
FruitSet.Sort([](const FString& A, const FString& B) {
    return A.Len() < B.Len();
});
// FruitSet = [Pear, Banana, Grapefruit]

七、运算符

1、赋值运算符=

TArray一样,是一次深拷贝

2、MoveTemp

TArray一样,支持移动语义MoveTemp,移动后,源映射为空

八、Slack(空闲容量)

1、Reverse():分配内存

TArray一样,分配内存,无需添加元素,如果分配的内存比当前小,则无效。

2、Shrink()Compact():移除所有Slack

Shrink() 将从容器的末端移除所有slack,如果映射中间存在slack则无法移除,首先应调用 Compact()CompactStable() 函数,将空白空间组合在一起,再调用Shrink()CompactStable 可在合并空元素时保持元素的排序。

九、KeyFuncs

TMap一致


文章作者: Woilin
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Woilin !
评论
  目录