메모내용

TMap

TMap 설명

TArray 다음으로 가장 자주 사용되는 컨테이너로, TMap 이 TSet 과 비슷한점은 구조가 Key Hash 기반이라는 점이다. TSet 과 다른점은 이 컨테이너는 데이터를 키-값 짝으로 TPair<KeyType, ValueType> 저장하며 , 저장 및 불러올 때는 키만 사용합니다.

TMap 과 TMultiMap

맵의 유형은 두가지 TMap 과 TMultiMap 이 있습니다.

TMap 상세

STL Map 과 TMap 비교

Unrel TMap 의 동작원리는 STL unordered_map 과 유사하며, Key Value 쌍이 필요한 자료구조에 광범위 하게 사용된다.

STL Map 특징

Unreal TMap 의 특징

사용법

맵 만들고 채우기

                    
                        // 비어 있는 자료구조 할당
                        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"}
                            ]
                        */
                    
                

활용