TSet é mais um tipo de container semelhante ao TArray. Conceitualmente, um Set é uma lista não ordenada de elementos únicos. O template TSet possui um parâmetro para permitir elementos duplicados e também possui uma função para ordenação, mas neste artigo vamos focar no uso tradicional de um Set.
Um TSet não usa um índice. O valor do elemento é usado como chave. Os elementos de um TSet precisam ser do mesmo tipo.
O exemplo abaixo cria um TSet com o nome CreaturesByRegion para armazenar elementos do tipo FString. Este TSet pode ser modificado no editor.
UPROPERTY(EditAnywhere, Category=SetExample)
TSet<FString> CreaturesByRegion;
Use a função Add() para adicionar elementos em um TSet usando C++.
CreaturesByRegion.Add(TEXT("Ghoul"));
CreaturesByRegion.Add(TEXT("Necrophage"));
CreaturesByRegion.Add(TEXT("Werewolf"));
Para ver quantos elementos existem no TSet, use a função Num():
int32 NumberOfElements = CreaturesByRegion.Num();
Use a função Contains() para verificar se um elemento faz parte de um TSet:
bool bHasCreature = CreaturesByRegion.Contains(TEXT("Necrophage"));
Para remover um elemento, use a função Remove(). Se o elemento não for encontrado, a função retornará o valor 0.
int32 RemovedAmount = CreaturesByRegion.Remove(TEXT("Ghoul"));
Para remover todos os itens de um TSet, use a função Empty():
CreaturesByRegion.Empty();
TSet possui algumas funções que realizam operações com dois Sets e retornam um Set diferente. Estas são as funções:
- Union(): Retorna um TSet contendo os elementos dos dois Sets. Os duplicados serão removidos.
- Difference(): Retorna um TSet que contém os elementos do primeiro Set que não estão no segundo Set.
- Intersect(): Retorna um TSet contendo apenas os elementos que existem nos dois Sets.
O código abaixo mostra o uso destas funções.
TSet<int32> Set1;
TSet<int32> Set2;
Set1.Add( 3 );
Set1.Add( 5 );
Set1.Add( 7 );
Set2.Add( 4 );
Set2.Add( 5 );
Set2.Add( 6 );
TSet<int32> UnionResult = Set1.Union(Set2);
// UnionResult = [ 3, 4, 5, 6, 7 ]
TSet<int32> DifferenceResult = Set1.Difference(Set2);
// DifferenceResult = [ 3, 7 ]
TSet<int32> IntersectResult = Set1.Intersect(Set2);
// IntersectResult = [ 5 ]
Exemplo de uso:
Crie uma classe C++ com o nome TestTSet usando como classe pai a classe Actor. No arquivo TestTSet.h, adicione a declaração dos componentes e do TSet:
#pragma once
#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "TestTSet.generated.h"
UCLASS()
class TUTOPROJECT_API ATestTSet : public AActor
{
GENERATED_BODY()
public:
// Sets default values for this actor's properties
ATestTSet();
protected:
// Called when the game starts or when spawned
virtual void BeginPlay() override;
public:
// Called every frame
virtual void Tick(float DeltaTime) override;
UPROPERTY(VisibleAnywhere)
USceneComponent* RootScene;
UPROPERTY(VisibleAnywhere)
UStaticMeshComponent* StaticMesh;
UPROPERTY(EditAnywhere, Category=SetExample)
TSet<FString> CreaturesByRegion;
};
Na função BeginPlay(), vamos escrever na tela o nome dos elementos do TSet. É usado um ranged-based for loop para iterar nos elementos do TSet. O conteúdo do arquivo TestTSet.cpp fica assim:
#include "TestTSet.h"
ATestTSet::ATestTSet()
{
// Set this actor to call Tick() every frame.
PrimaryActorTick.bCanEverTick = true;
RootScene = CreateDefaultSubobject<USceneComponent>("RootScene");
RootComponent = RootScene;
StaticMesh = CreateDefaultSubobject<UStaticMeshComponent>("StaticMesh");
StaticMesh->SetupAttachment(RootScene);
}
// Called when the game starts or when spawned
void ATestTSet::BeginPlay()
{
Super::BeginPlay();
FString Message;
if(CreaturesByRegion.Num() > 0)
{
Message = FString::Printf(TEXT("Number of elements in the Set: %d"),
CreaturesByRegion.Num());
if(GEngine)
{
GEngine->AddOnScreenDebugMessage(-1, 10, FColor::Red, Message);
for (FString Creature : CreaturesByRegion)
{
Message = FString::Printf(TEXT("Creature Name: %s"), *Creature);
GEngine->AddOnScreenDebugMessage(-1, 10, FColor::Red, Message);
}
}
}
}
// Called every frame
void ATestTSet::Tick(float DeltaTime)
{
Super::Tick(DeltaTime);
}
Compile o código C++ e adicione uma instância de TestTSet no nível. Você pode adicionar elementos no TSet usando a aba Details da instância. Tente adicionar um valor duplicado. Apacererá uma mensagem dizendo que não é permitido.
Inicie o jogo e veja na tela os nomes dos elementos adicionados ao TSet: