TMap的查询
一.
1.[]是直接查询
如果没有键,就会触发断言。

2.一般会用Contains先判断,再查询
void ATMapActor::QueryMap()
{TMap<int32, FString> FruitMap;FruitMap.Add(5, TEXT("Grapefruit"));FruitMap.Add(7, TEXT("Pineapple"));FruitMap.Add(9, TEXT("Pear")); //添加相同的键,会重置掉原来的int32 num = FruitMap.Num();bool bHas7 = FruitMap.Contains(7);bool bHas8 = FruitMap.Contains(8);FString Val7 = FruitMap[7];Val7 += TEXT("Copy");FString& Val7Ref = FruitMap[7];Val7Ref += TEXT("Ref");const FString& Val7ConstRef = FruitMap[7];if (bHas8){FString Val8 = FruitMap[8];}
}这里用引用会,改到TMap里本身的值。直接等号是复制体,如果不想它被改动,就在引用钱买你加const。
二.Find 查找

看源码,Find一般返回的是空指针。如果不是空指针,就能访问。
void ATMapActor::FindMap()
{TMap<int32, FString> FruitMap;FruitMap.Add(5, TEXT("Grapefruit"));FruitMap.Add(7, TEXT("Pineapple"));FruitMap.Add(9, TEXT("Pear")); //添加相同的键,会重置掉原来的FString* Ptr7 = FruitMap.Find(7);FString* Ptr8 = FruitMap.Find(8);if (FString* Ptr7Test = FruitMap.Find(7)){UE_LOG(LogTemp,Warning,TEXT("%d-%s"),7,**Ptr7Test);}}FindOrAdd如果没有查询到,就会创建新的元素加入,返回的是引用。

FindRef,返回的是一个值副本,不会创建新的元素。如果没有就会返回默认值的副本。
void ATMapActor::FindAddMap()
{TMap<int32, FString> FruitMap;FruitMap.Add(5, TEXT("Grapefruit"));FruitMap.Add(7, TEXT("Pineapple"));FruitMap.Add(9, TEXT("Pear")); //可能会创建的新的元素,返回的是引用。FString& Ref7 = FruitMap.FindOrAdd(7);FString& Ref8 = FruitMap.FindOrAdd(8);Ref8 = TEXT("NewAdd8");FString Val7 = FruitMap.FindRef(7);Val7 += TEXT("998");
//返回的是一个值。不会创建新的元素,如果没有就构建一个临时的默认值返回,返回的是值的副本。FString Val6 = FruitMap.FindRef(6); //FString Val17 = FruitMap.FindRef(8);int a = 1;
}FindKey,按值找key,更慢。但只找第一个。

void ATMapActor::FindKeyMap()
{TMap<int32, FString> FruitMap;FruitMap.Add(5, TEXT("Grapefruit"));FruitMap.Add(7, TEXT("Pineapple"));FruitMap.Add(9, TEXT("Pear"));//按照值去找key,更慢。且只找第一个const int32* KeyPearPtr = FruitMap.FindKey(TEXT("Pear"));const int32* KeyPineapplePtr = FruitMap.FindKey(TEXT("Pineapple"));
}GenerateKeyArray 会将所有的键值生成数组。
GenerateValueArray 会将所有的值生成数组,都是无序的。无法一一对应。

void ATMapActor::GetAllKeysAndValueMap()
{TArray<int32> FruitKeys;TArray<FString> FruitValues;TMap<int32, FString> FruitMap;FruitMap.Add(5, TEXT("Grapefruit"));FruitMap.Add(7, TEXT("Pineapple"));FruitMap.Add(9, TEXT("Pear"));FruitMap.GenerateKeyArray(FruitKeys);FruitMap.GenerateValueArray(FruitValues);//TArray<int32> FruitKeys;//TArray<FString> FruitValues;int a = 1;
}
