TArray 다음으로 가장 자주 사용되는 컨테이너로, TMap 이 TSet 과 비슷한점은 구조가 Key Hash 기반이라는 점이다. TSet 과 다른점은 이 컨테이너는 데이터를 키-값 짝으로 TPair<KeyType, ValueType> 저장하며 , 저장 및 불러올 때는 키만 사용합니다.
맵의 유형은 두가지 TMap 과 TMultiMap 이 있습니다.
Unrel TMap 의 동작원리는 STL unordered_map 과 유사하며, Key Value 쌍이 필요한 자료구조에 광범위 하게 사용된다.
// 비어 있는 자료구조 할당
TMap <int32, FString> FruitMap;
// Add, Emplace 사용 가능
FruitMap.Add(5, TEXT("Kiwi"));
FruitMap.Emplace (7, TEXT("Mango"));
// Append 사용 가능
TMap <int32, FString> FruitMap2;
FruitMap2.Add(1, TEXT("Banana"));
FruitMap2.Add(2, TEXT("Pear"));
FruitMap.Append(FruitMap2);
/*
FruitMap == [
{ Key : 5, Value : "Kiwi"},
{ Key : 7, Value : "Mango"},
{ Key : 1, Value : "Banana"},
{ Key : 2, Value : "Pear"},
]
// FruitMap2 는 비게 됩니다.
FruitMap2 == [
]
*/
// 범위기반 반복문 사용가능
for(auto& elem : FruitMap)
{
int32 key = elem.Key;
FString value = elem.Value;
}
// 두가지 버전 이터레이터 제공
// CreateIterator , CreateConstIterator
for(auto It = FruitMap.CreateConstIterator() ; It ; ++ It)
{
int32 Key = It.Key(), // It->Key 하는것과 같다
FString Value = It.Value() // It->Value 하는것과 같다
}
/*
FruitMap == [
{ Key : 5, Value : "Kiwi"},
{ Key : 7, Value : "Mango"},
{ Key : 1, Value : "Banana"},
{ Key : 2, Value : "Pear"},
]
*/
// 개수
int32 Count = FruitMap.Num(); // 4
// 키 포함 여부
bool b1 = FruitMap.Contains(5); // true;
bool b2 = FruitMap.Contains(8); // false;
// 인덱싱
FString Value = FruitMap[2]; // "Pear"
// 값이 있는지 확실치 않다면, Contains 함수 다음에, operator 를 호출해도 되지만.
// Find 는 이 동작을 한번의 조회로 수행합니다.
// Find 는 맵에 키가 들어있으면 엘리먼트 값으로의 포인터를, 없으면 널 포인ㅇ터를 반환합니다.
// Find 를 const 맵에 호출하면 반환하는 포인터도 const 가 됩니다.
FString* pVar1 = FruitMap[2]; // FString * ----> (TEXT("Pear")) 를 가리키는 포인터
FString* pVar2 = FruitMap[3]; // nullptr
// Value 로 key 값 역조회
const int32* KeyMangoPtr = FruitMap.FindKey(TEXT("Mango")); // 5
const int32* KeyApplePtr = FruitMap.FindKey(TEXT("Apple")); // nullptr
// Key 배열, 값 배열 만들기 (사본)
// 배열은 채우기전 비워지므로, Element 최종수는 TMap 의 Element 수와 같습니다.
TArray<int32> FruitKeys;
TArray<FString> FruitValues;
FruitKeys.Add(999); // 이렇게 다른값을 아무리 넣어도, 다 비워지고, 사본으로 채운다.
FruitKeys.Add(123);
FruitMap.GenerateKeyArray(FruitKeys); // {5,7,1,2}
FruitMap.GenerateValueArray(FruitValues); // {"Kiwi", "Mango", "Banana", "Pear"}
/*
FruitMap == [
{ Key : 5, Value : "Kiwi"},
{ Key : 7, Value : "Mango"},
{ Key : 1, Value : "Banana"},
{ Key : 2, Value : "Pear"}
]
*/
// Remove
FruitMap.Remove(2);
/*
FruitMap == [
{ Key : 5, Value : "Kiwi"},
{ Key : 7, Value : "Mango"},
{ Key : 1, Value : "Banana"}
]
*/
// FindAndRemoveChecked : 맵에서 찾고, 제거. Checked 가 붙으면 키가 존재하지 않을시 check 함수(assert)를 호출합니다.
FruitMap.FindAndRemoveChecked(1);
/*
FruitMap == [
{ Key : 5, Value : "Kiwi"},
{ Key : 7, Value : "Mango"}
]
*/
/*
FruitMap == [
{ Key : 5, Value : "Kiwi"},
{ Key : 7, Value : "Mango"},
{ Key : 1, Value : "Banana"},
{ Key : 2, Value : "Pear"}
]
*/
// key 부분을 기준으로 정렬하기
FruitMap.KeySort([](int32 A, int32 B){
return A>B; // sort keys in reverse
});
/*
FruitMap == [
{ Key : 7, Value : "Mango"},
{ Key : 5, Value : "Kiwi"},
{ Key : 2, Value : "Pear"},
{ Key : 1, Value : "Banana"}
]
*/
// value 부분을 기준으로 정렬하기
FruitMap.ValueSort([](const FString& A, const FString& B){
return A.Len() < B.Len(); // sort strings by length
});
/*
FruitMap == [
{ Key : 1, Value : "Banana"},
{ Key : 7, Value : "Mango"},
{ Key : 5, Value : "Kiwi"},
{ Key : 2, Value : "Pear"}
]
*/