TMap: Maps w C++

TMap  to kolejny typ kontenera szeroko stosowany w Unreal Engine. Elementy mapy to pary klucz-wartość. Typ klucza może różnić się od typu wartości. Duplikaty kluczy są niedozwolone. Wyszukiwanie elementów odbywa się za pomocą wartości klucza.

Ten kod tworzy TMap, który można modyfikować w edytorze. Typ klucza to FString, a typ wartości to float .

UPROPERTY(EditAnywhere, Category=MapExample)
TMap<FString, float> PriceTable;

Aby dodać elementy do TMap , użyj funkcji Add () przekazującej klucz i wartość jako parametry.

PriceTable.Add( TEXT("Axe"), 37.5f );
PriceTable.Add( TEXT("Hammer"), 25.0f );
PriceTable.Add( TEXT("Spear"), 18.0f );

Użyj funkcji Remove () przekazującej klucz jako parametr, aby usunąć element z TMap.

PriceTable.Remove( TEXT("Hammer") );

Funkcja Empty () usuwa wszystkie elementy z mapy TMap.

PriceTable.Empty();

Liczbę elementów w TMap uzyskuje się za pomocą funkcji Num().

int32 NumberOfElements = PriceTable.Num();

Funkcja Find () przyjmuje klucz jako parametr i zwraca wskaźnik do wartości skojarzonej z kluczem. Jeśli klucz nie zostanie znaleziony, zwracany jest pusty wskaźnik (nullptr).

float* PtrPrice = PriceTable.Find( TEXT("Spear") );

Iterowanie po TMap można wykonać za pomocą pętli for opartej na zakresie . Element TMap jest typu TPair i zawiera zmienne Klucz i Wartość . Dla uproszczenia możesz użyć słowa kluczowego auto w C ++ razem z operatorem & , aby zdefiniować odwołanie do elementu TMap, jak pokazano w poniższym kodzie.

for (auto& ItemPrice : PriceTable)
{
  UE_LOG(LogTemp, Warning, TEXT("%s - %.2f"), *(ItemPrice.Key), ItemPrice.Value);
}

Znak specjalny % s zostanie zastąpiony zawartością zmiennej ItemPrice.Key . Konieczne jest umieszczenie operatora * przed zmiennymi typu FString . Wartość ItemPrice.Value zastąpi znaki % .2f i zostanie wyświetlona z dwoma cyframi dziesiętnymi.

Przykładowe użycie:

Utwórz klasę C ++ o nazwie TestTMap, używając klasy Actor jako klasy nadrzędnej. W pliku TestTMap.h dodaj deklarację komponentów i TMap:

#pragma once

#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "TestTMap.generated.h"

UCLASS()
class TUTOPROJECT_API ATestTMap : public AActor
{
	GENERATED_BODY()
	
public:	
	// Sets default values for this actor's properties
	ATestTMap();

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=MapExample)
	TMap<FString, float> PriceTable;
};

W funkcji BeginPlay() zostanie użyta pętla for oparta na zakresie, która zapisuje na ekranie nazwę i cenę elementów TMap . Zawartość pliku TestTMap.cpp wygląda następująco:

#include "TestTMap.h"

ATestTMap::ATestTMap()
{
  // 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 ATestTMap::BeginPlay()
{
  Super::BeginPlay();

  FString Message;
  
  if(PriceTable.Num() > 0)
  {
    Message = FString::Printf(TEXT("Number of elements in the Map: %d"),
                              PriceTable.Num());

    if(GEngine)
    {	
     GEngine->AddOnScreenDebugMessage(-1, 10, FColor::Red, Message);
	  
	  
     for(auto& ItemPrice : PriceTable)
     {
      Message = FString::Printf(TEXT("%s - %.2f"), *(ItemPrice.Key), ItemPrice.Value);
		
      GEngine->AddOnScreenDebugMessage(-1, 10, FColor::Red, Message);
     }
    }	  
  }	    
}

// Called every frame
void ATestTMap::Tick(float DeltaTime)
{
  Super::Tick(DeltaTime);
}

Skompiluj kod C ++ i dodaj instancję TestTMap na poziomie. Dodaj elementy do TMap, korzystając z karty Details instancji. Nie będziesz w stanie dodać duplikatu klucza.

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


Źródło: https://romeroblueprints.blogspot.com/2021/01/tmap-maps-in-c.html