[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 |