๐ง 1. ์ธ๋ฆฌ์ผ ๊ตฌ์กฐ์ฒด
- ๋ฐ์ดํฐ ์ ์ฅ/์ ์ก์ ํนํ๋ ๊ฐ๋ฒผ์ด ๊ฐ์ฒด
- ๋๋ถ๋ถ GENERATED_BODY ๋งคํฌ๋ก๋ฅผ ์ ์ธํด์ค๋ค.
- ๋ฆฌํ๋ ์ , ์ง๋ ฌํ์ ๊ฐ์ ์ ์ฉํ ๊ธฐ๋ฅ์ ์ง์ํจ
- GENERATED_BODY๋ฅผ ์ ์ธํ ๊ตฌ์กฐ์ฒด๋ UScriptStruct ํด๋์ค๋ก ๊ตฌํ๋จ
- ์ด ๊ฒฝ์ฐ ์ ํ์ ์ผ๋ก ๋ฆฌํ๋ ์ ์ ์ง์ํจ ๐ ์์ฑ UPROPERTY๋ง ์ ์ธํ ์ ์๊ณ ํจ์ UFUNCTION์ ์ ์ธํ ์ ์์
- ์ธ๋ฆฌ์ผ ์์ง์ ๊ตฌ์กฐ์ฒด ์ด๋ฆ์ F๋ก ์์ํจ
- ๋๋ถ๋ถ ํ ๋ฉ๋ชจ๋ฆฌ ํ ๋น(ํฌ์ธํฐ ์ฐ์ฐ)์์ด ์คํ ๋ด ๋ฐ์ดํฐ๋ก ์ฌ์ฉ๋จ
- NewObjectAPI๋ฅผ ์ฌ์ฉํ ์ ์์
๐ ๋ฆฌํ๋ ์ ๊ด๋ จ ๊ณ์ธต ๊ตฌ์กฐ
์ธ๋ฆฌ์ผ์์๋ ๊ตฌ์กฐ์ฒด์ ํด๋์ค๊ฐ ๊ตฌ์กฐ, ์ฌ์ฉ๋ฒ์ด ๋ค๋ฅด๋ค.
๐ MyGameInstance(h, cpp)
// 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;
UPROPERTY()
TArray<TObjectPtr<class UStudent>> Students;
};
// ๋๋ค์ผ๋ก ์ด๋ฆ ๋ง๋ค๊ธฐ(Init ์ธ๋ถ)
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();
}
// ๊ตฌ์กฐ์ฒด (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์ผ๋ก ํํ
TSet<FString> AllUniqueNames;
Algo::Transform(StudentsData, AllUniqueNames,
[](const FStudentData& Val) {
return Val.Name;
}
);
UE_LOG(LogTemp, Log, TEXT("์ค๋ณต ์๋ ํ์ ์ด๋ฆ์ ์ : %d"), AllUniqueNames.Num());
๐ฉ ๊ฐ์ฒด์ ๋์ ๋ฐฐ์ด ๊ด๋ฆฌ๋ฅผ ์ํ ์์ ๋ค์ด์ด๊ทธ๋จ
์ธ๋ฆฌ์ผ ์ค๋ธ์ ํธ ํ์์ ๋์ ๋ฐฐ์ด ๊ด๋ฆฌ ๋ฐฉ๋ฒ
์ธ๋ฆฌ์ผ ๊ตฌ์กฐ์ฒด ํ์ ์ ๋ณด์ ๋์ ๋ฐฐ์ด ๊ด๋ฆฌ ๋ฐฉ๋ฒ
// ๊ตฌ์กฐ์ฒด
TArray<FStudentData> StudentsData;
// ์ค๋ธ์ ํธ
UPROPERTY()
TArray<TObjectPtr<class UStudent>> Students;
๐ง 2. TMap
๐ STL map ๊ณผ TMap์ ๋น๊ต
- STL map์ ํน์ง
- STL set๊ณผ ๋์ผํ๊ฒ ์ด์งํธ๋ฆฌ๋ก ๊ตฌ์ฑ
- ์ ๋ ฌ์ ์ง์ํ์ง๋ง, ๋ฉ๋ชจ๋ฆฌ ๊ตฌ์ฑ์ด ํจ์จ์ ์ด์ง ์์ผ๋ฉฐ, ๋ฐ์ดํฐ ์ญ์ ์ ์ฌ๊ตฌ์ถ์ด ์ผ์ด๋ ์ ์์
- ๋ชจ๋ ์๋ฃ๋ฅผ ์ํํ๋๋ฐ ์ ํฉํ์ง ์์
- ์ธ๋ฆฌ์ผ TMap์ ํน์ง
- ํค, ๋ฐธ๋ฅ ๊ตฌ์ฑ์ ํํ ๋ฐ์ดํฐ์ TSet ๊ตฌ์กฐ๋ก ๊ตฌํ๋์ด ์์
- ํด์ํ ์ด๋ธ ํํ๋ก ๊ตฌ์ถ๋์ด ์์ด ๋น ๋ฅธ ๊ฒ์์ด ๊ฐ๋ฅํจ
- ๋์ ๋ฐฐ์ด์ ํํ๋ก ๋ฐ์ดํฐ๊ฐ ๋ชจ์ฌ์์
- ๋ฐ์ดํฐ๋ ๋น ๋ฅด๊ฒ ์ํํ ์ ์์
- ๋ฐ์ดํฐ๋ ์ญ์ ํด๋ ์ฌ๊ตฌ์ถ์ด ์ผ์ด๋์ง ์์
- ๋น์ด์๋ ๋ฐ์ดํฐ๊ฐ ์์ ์ ์์
- TMultiMap์ ์ฌ์ฉํ๋ฉด ์ค๋ณต ๋ฐ์ดํฐ๋ฅผ ๊ด๋ฆฌํ ์ ์์
- ๋์ ์๋ฆฌ๋ STL unordered_map๊ณผ ์ ์ฌํจ
- ํค, ๋ฐธ๋ฅ ์์ด ํ์ํ ์๋ฃ๊ตฌ์กฐ์ ๊ด๋ฒ์ํ๊ฒ ์ฌ์ฉ๋จ
- TSet๊ณผ ์ ์ฌํ์ง๋ง TPair<key, value>์ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๋ค
๐ MyGameInstance(h, cpp)
bool operator==(const FStudentData& InOther) const {
return Order == InOther.Order;
}
friend FORCEINLINE uint32 GetTypeHash(const FStudentData& InStudentData) {
return GetTypeHash(InStudentData.Order);
}
// TMap (๊ธฐ๋ณธ์ ์ผ๋ก ์ค๋ณต ํ์ฉO)
Algo::Transform(StudentsData, StudentsMap,
[](const FStudentData& Val) {
return TPair<int32, FString>(Val.Order, Val.Name);
}
);
UE_LOG(LogTemp, Log, TEXT("์๋ฒ์ ๋ฐ๋ฅธ ํ์ ๋งต์ ๋ ์ฝ๋ ์ : %d"), StudentsMap.Num());
// ์ค๋ณต ํ์ฉX
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());
// ์ค๋ณต ํ์ฉO
TMultiMap<FString, int32> StudentMapByName;
Algo::Transform(StudentsData, StudentMapByName,
[](const FStudentData& Val) {
return TPair<FString, int32>(Val.Name, Val.Order);
}
);
UE_LOG(LogTemp, Log, TEXT("์ด๋ฆ์ ๋ฐ๋ฅธ ํ์ ๋ฉํฐ๋งต์ ๋ ์ฝ๋ ์ : %d"), StudentMapByName.Num());
// ํน์ ๋ฐ์ดํฐ ์ฐพ๊ธฐ
const FString TargetName(TEXT("์ดํ์"));
TArray<int32> AllOrders;
StudentMapByName.MultiFind(TargetName, AllOrders);
UE_LOG(LogTemp, Log, TEXT("์ด๋ฆ์ด %s์ธ ํ์ ์ : %d"), *TargetName, AllOrders.Num());
// TSet์์ ์ฌ์ฉํ๊ธฐ
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) |
TArray ๐ ๋นํ์๋ ๋ฉ๋ชจ๋ฆฌ, ๊ฐ์ฅ ๋์ ์ ๊ทผ์ฑ๋ฅ, ๊ฐ์ฅ ๋์ ์ํ์ฑ๋ฅ
TSet ๐ ๋น ๋ฅธ ์ค๋ณต ๊ฐ์ง
TMap ๐ ์ค๋ณต ๋ถํ, ํค ๋ฐธ๋ฅ ๊ด๋ฆฌ
TMultiMap ๐ ์ค๋ณต ํ์ฉ, ํค ๋ฐธ๋ฅ ๊ด๋ฆฌ
'โ๏ธ ์์ง > ๐ซ ์ธ๋ฆฌ์ผ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Unreal] ์์ํด์ ์ธ๋ฆฌ์ผ 2024 - 1. ๋ ๋ฒจ ์ ์ํ๊ธฐ (0) | 2024.05.05 |
---|---|
[Unreal] ์ธ๋ฆฌ์ผ ์์ง์ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ (0) | 2024.05.05 |
[Unreal] ์ธ๋ฆฌ์ผ ์ปจํ ์ด๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ1 - Array์ Set (0) | 2024.05.04 |
[Unreal] ๋ธ๋ฆฌ๊ฒ์ดํธ (0) | 2024.05.04 |
[Unreal] ์ปดํฌ์ง์ (0) | 2024.05.03 |