Game Programming/UE4

[UE4] TMap

Doanie 2023. 9. 9. 21:30

[UE4] TMap


TMap

언리얼엔진에서 TArray 다음으로 많이 쓰이는 컨테이너이며, 키(Key) 해시 기반을 이용하는 TSet과는 비슷하지만 데이터를 키값을 짝으로 저장하며, 키는 저장 및 불러오기를 할 때만 사용한다. 'TMap''TMultiMap' 두가지 유형이 있으며, 이 둘의 차이점은 TMap의 키는 고유한 반면, TMultiMap은 다수의 동일한 키를 지원한다. 즉, 기존 키값에 값을 추가하면 TMap은 기존 것에 대체가 되며, TMultiMap은 새로 저장한다.

생성 및 할당

//. 생성
TMap<int32, FString> NumberMap;	// 자료형<키 자료형, 엘리멘트 자료형>

//. Add
NumberMap.Add(1, TEXT("One"));
NumberMap.Add(2, TEXT("Two"));
NumberMap.Add(3, TEXT("Three"));

/*
NumberMap == [
	{ key = 1, value = "One" },
   	{ key = 2, value = "Two" },
   	{ key = 3, value = "Three" }
]
*/

NumberMap.Add(2, Second);	// 동일한 키값으로 Add 시 대체
/*
NumberMap == [
	{ key = 1, value = "One" },
   	{ key = 2, value = "Second" },
   	{ key = 3, value = "Three" }
]
*/

NumberMap.Add(4);	// 키값만 Add하면 기본값으로 생성
/*
NumberMap == [
	{ key = 1, value = "One" },
   	{ key = 2, value = "Second" },
   	{ key = 3, value = "Three" },
   	{ key = 4, value = "" }
]
*/

//. Emplace : Add와 달리 임시생성을 피할 수 있다.
NumberMap.Emplace(5, TEXT("Five"));
/*
NumberMap == [
	{ key = 1, value = "One" },
   	{ key = 2, value = "Second" },
   	{ key = 3, value = "Three" },
   	{ key = 4, value = "" },
   	{ key = 5, value = "Five" }
]
*/

 Emplace의 경우 값에는 임시 FString 생성을 피할 수 있다. TArray 와는 달리 단일 인수 생성자로 맵속에 엘리먼트를 Emplace 시키는 것만 가능하다.

//. Append
TMap<int32, FString> NumMap;
NumMap.Emplace(1, TEXT("First"));
NumMap.Emplace(3, TEXT("Three"));
NumberMap.Append(NumMap);
/*
NumberMap == [
	{ key = 1, value = "First" },
   	{ key = 2, value = "Second" },
   	{ key = 3, value = "Third" },
   	{ key = 4, value = "" },
   	{ key = 5, value = "Five" }
]
*/

반복

FString strings01;
for (auto& str : NumberMap)
{
	strings01 += str.Value;
   	strings01 += TEXT(" ");
}
// strings01 == "First Second Third  Five"

FString strings02
for(auto it = strArr.CreateConstIterator(); it; ++it)
{
	strings02 += *it.Value();
   	strings02 += TEXT(" ");
} 
// strings02 == "First Second Third  Five"

제거

//. Remove
NumberMap.Remove(4);
NumberMap.Remove(5);
/*
NumberMap == [
	{ key = 1, value = "First" },
   	{ key = 2, value = "Second" },
   	{ key = 3, value = "Third" }
]
*/

//. FindAndRemoveChecked : 제거를 하지만 해당 키를 가지고 있지 않다면 assert된다.
NumberMap.FindAndRemoveChecked(5);	//Assertion!!!!

TMap<int32, FString> tempMap;
tempMap.Append(NumberMap);
/*
tempMap == [
	{ key = 1, value = "First" },
   	{ key = 2, value = "Second" },
   	{ key = 3, value = "Third" }
]
*/

//. Empty
tempMap.Empty();
/*
tempMap == [ ]
*/

그 외 자주 사용하는 것

//. Num

int32 count = NumberMap.Num();	// count == 3

//. Contains
bool bHas01 = NumberMap.Contains(1);	// bHas01 == true
bool bHas02 = NumberMap.Contains(6);	// bHas06 == false

//. Find
FString* findNum = NumberMap.Find(2);	// *findNum == "Second"

//. FindOrAdd

NumberMap.FindOrAdd(1);
/*
NumberMap == [
	{ key = 1, value = "First" },
   	{ key = 2, value = "Second" },
   	{ key = 3, value = "Third" }
]
*/
NumberMap.FindOrAdd(4);
/*
NumberMap == [
	{ key = 1, value = "First" },
   	{ key = 2, value = "Second" },
   	{ key = 3, value = "Third" },
   	{ key = 4, value = "" }
]
*/

//. Sort

NumberMap.ValueSort([](const FString& A, const FString& B) {
    return A.Len() < B.Len(); // sort strings by length
});
// NumberMap == [
//  { Key: 4, Value: ""   },
//  { Key: 1, Value: "First"  },
//  { Key: 3, Value: "Third"  },
//  { Key: 2, Value: "Second" }
// ]

NumberMap.KeySort([](int32 A, int32 B) {
    return A > B; // sort keys in reverse
});
// NumberMap == [
//  { Key: 1, Value: "First"  },
//  { Key: 2, Value: "Second"  },
//  { Key: 3, Value: "Third"   },
//  { Key: 4, Value: "" }
// ]

TMap에 자주 사용하는 것들에 대해 알아보았습니다. TMap은 TArray와 달리 키값을 이용하여 원하는 값을 각각 따로 저장하여 사용하기 때문에 아주 유용한 것 같다.

'Game Programming > UE4' 카테고리의 다른 글

[UE4] BindWidget  (0) 2023.10.28
[UE4] Smart Pointer  (0) 2023.10.21
[UE4] Delegate  (0) 2023.09.17
[UE4] TArray  (0) 2023.09.02
[UE4] Log  (0) 2022.10.13