MyGameInstance.h
// Fill out your copyright notice in the Description page of Project Settings.
#pragma once
#include "CoreMinimal.h"
#include "Engine/GameInstance.h"
#include "MyGameInstance.generated.h"
USTRUCT()
struct FStudentData
{
GENERATED_BODY()
FStudentData()
{
Name = TEXT("홍길동");
Order = -1;
}
FStudentData(FString InName, int32 InOrder) : Name(InName), Order(InOrder) {}
UPROPERTY()
FString Name;
UPROPERTY()
int32 Order;
};
/**
*
*/
UCLASS()
class UNREALCONTAINER_API UMyGameInstance : public UGameInstance
{
GENERATED_BODY()
public:
virtual void Init() override;
private:
TArray<FStudentData> StudentsData;
// 언리얼 오브젝트 헤더에서 언리얼 오브젝트 포인터를 선언할 때는 TObjectPtr로 감싸줘야 된다.
// TArray에 내부적으로 포인터를 관리하게 되면 반드시 자동으로 언리얼 엔진이 메모리를 관리할 수 있게
// UPROPERTY() 매크로를 붙여줘야 된다.(필수.)
UPROPERTY()
TArray<TObjectPtr<class UStudent>> Students;
};
MyGameInstance.cpp
// Fill out your copyright notice in the Description page of Project Settings.
#include "MyGameInstance.h"
#include "Algo/Accumulate.h"
FString MakeRandomName()
{
TCHAR FirstChar[] = TEXT("김이박최");
TCHAR MiddleChar[] = TEXT("상혜지성");
TCHAR LastChar[] = TEXT("수은원연");
TArray<TCHAR> RandArray;
RandArray.SetNum(3);
RandArray[0] = FirstChar[FMath::RandRange(0, 3)];
RandArray[1] = MiddleChar[FMath::RandRange(0, 3)];
RandArray[2] = LastChar[FMath::RandRange(0, 3)];
return RandArray.GetData();
}
void UMyGameInstance::Init()
{
Super::Init();
const int32 StudentNum = 300;
for (int32 ix = 1; ix <= StudentNum; ++ix)
{
StudentsData.Emplace(FStudentData(MakeRandomName(), ix));
}
TArray<FString> AllStudentsNames;
Algo::Transform(StudentsData, AllStudentsNames,
[](const FStudentData& Val)
{
return Val.Name;
}
);
UE_LOG(LogTemp, Log, TEXT("모든 학생 이름의 수: %d"), AllStudentsNames.Num());
TSet<FString> AllUniqueNames;
Algo::Transform(StudentsData, AllUniqueNames,
[](const FStudentData& Val)
{
return Val.Name;
}
);
UE_LOG(LogTemp, Log, TEXT("중복 없는 학생 이름의 수: %d"), AllUniqueNames.Num());
}
void UMyGameInstance::Init()
{
Super::Init();
const int32 StudentNum = 300;
for (int32 ix = 1; ix <= StudentNum; ++ix)
{
StudentsData.Emplace(FStudentData(MakeRandomName(), ix));
}
TMap<int32, FString> StudentsMap;
Algo::Transform(StudentsData, StudentsMap,
[](const FStudentData& Val)
{
return TPair<int32, FString>(Val.Order, Val.Name);
}
);
UE_LOG(LogTemp, Log, TEXT("순번에 따른 학생 맵의 레코드 수: %d"), StudentsMap.Num());
TMap<FString, int32> StudentsMapByUniqueName;
Algo::Transform(StudentsData, StudentsMapByUniqueName,
[](const FStudentData& Val)
{
return TPair<FString, int32>(Val.Name, Val.Order);
}
);
UE_LOG(LogTemp, Log, TEXT("이름에 따른 학생 맵의 레코드 수: %d"), StudentsMapByUniqueName.Num());
// 중복.
TMultiMap<FString, int32> StudentsMapByName;
Algo::Transform(StudentsData, StudentsMapByName,
[](const FStudentData& Val)
{
return TPair<FString, int32>(Val.Name, Val.Order);
}
);
UE_LOG(LogTemp, Log, TEXT("이름에 따른 학생 멀티맵의 레코드 수: %d"), StudentsMapByName.Num());
const FString TargetName(TEXT("이혜은"));
TArray<int32> AllOrders;
StudentsMapByName.MultiFind(TargetName, AllOrders);
UE_LOG(LogTemp, Log, TEXT("이름이 %s인 학생 수: %d"), *TargetName, AllOrders.Num());
}
struct FStudentData
USTRUCT()
struct FStudentData
{
GENERATED_BODY()
FStudentData()
{
Name = TEXT("홍길동");
Order = -1;
}
FStudentData(FString InName, int32 InOrder) : Name(InName), Order(InOrder) {}
bool operator==(const FStudentData& InOther) const
{
return Order == InOther.Order;
}
friend FORCEINLINE uint32 GetTypeHash(const FStudentData& InStudentData)
{
return GetTypeHash(InStudentData.Order);
}
UPROPERTY()
FString Name;
UPROPERTY()
int32 Order;
};
TSet<FStudent>
void UMyGameInstance::Init()
{
Super::Init();
const int32 StudentNum = 300;
TSet<FStudentData> StudentsSet;
for (int32 ix = 1; ix <= StudentNum; ++ix)
{
StudentsSet.Emplace(FStudentData(MakeRandomName(), ix));
}
}
| TArray | TSet | TMap | TMultiMap | |
|---|---|---|---|---|
| 접근 | O(1) | O(1) | O(1) | O(1) |
| 검색 | O(N) | O(1) | O(1) | O(1) |
| 삽입 | O(N) | O(1) | O(1) | O(1) |
| 삭제 | O(N) | O(1) | O(1) | O(1) |