TSet: Sets w C++

TSet to kolejny typ kontenera podobny do TArray . Koncepcyjnie jes to nieuporządkowana lista unikalnych elementów. Tset szablon posiada parametr umożliwiający zduplikowanych elementów, a także posiada funkcję sortowania, ale w tym artykule skupimy się na tradycyjnym używanie odbiornika.

Tset nie korzysta z indeksu. Wartość elementu jest używana jako klucz. Elementy TSet muszą być tego samego typu.

Poniższy przykład tworzy TSet o nazwie CreaturesByRegion do przechowywania elementów typu FString. Ten zestaw TSet można modyfikować w edytorze.

UPROPERTY(EditAnywhere, Category=SetExample)
TSet<FString> CreaturesByRegion;

Użyj funkcji Add (), aby dodać elementy do TSet w C++.

CreaturesByRegion.Add(TEXT("Ghoul"));
CreaturesByRegion.Add(TEXT("Necrophage"));
CreaturesByRegion.Add(TEXT("Werewolf"));

Aby zobaczyć, ile elementów jest w TSet , użyj funkcji Num():

int32 NumberOfElements = CreaturesByRegion.Num();

Użyj funkcji Contains(), aby sprawdzić, czy element jest częścią TSet:

bool bHasCreature = CreaturesByRegion.Contains(TEXT("Necrophage"));

Aby usunąć element, użyj funkcji Remove() . Jeśli element nie zostanie znaleziony, funkcja zwraca wartość 0.

int32 RemovedAmount = CreaturesByRegion.Remove(TEXT("Ghoul"));

Aby usunąć wszystkie elementy z TSet , użyj funkcji Empty () : 

CreaturesByRegion.Empty();

TSet  ma pewne funkcje, które wykonują operacje na dwóch zestawach i zwracają inny zestaw. Oto funkcje:

  • Unio() :  zwraca zestaw TSet zawierający elementy dwóch zestawów. Duplikaty zostaną usunięte.
  • Difference() :  Zwraca TSet, który zawiera elementy pierwszego zestawu, których nie ma w drugim zestawie.
  • Intersect() :  zwraca TSet zawierający tylko elementy, które istnieją w dwóch zestawach.

Poniższy kod przedstawia użycie tych funkcji.

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 ]

Przykładowe użycie:

Utwórz klasę C++ o nazwie TestTSet, używając klasy Actor jako klasy nadrzędnej. W pliku TestTSet.h dodaj deklarację komponentów i 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;
};

W funkcji BeginPlay() napiszemy na ekranie nazwy elementów TSet. Wynosiła oparte pętli służy do iteracyjnego Tset elementów. Zawartość pliku TestTSet.cpp wygląda następująco: 

#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);
}

Skompiluj kod C ++ i dodaj wystąpienie TestTSet na poziomie. Możesz dodawać elementy w TSet, korzystając z zakładki Details instancji. Spróbuj dodać zduplikowaną wartość. Pojawi się komunikat, że jest to niedozwolone.

Uruchom grę i zobacz na ekranie nazwy elementów dodanych do TSet:


Źródło: https://romeroblueprints.blogspot.com/2020/12/tset-sets-in-c.html