关于 UE4 TMap
1. 前一篇关于 通过 Key 查找 Value 的部分:
2. 通过 Value 查找 Key
FindKey(Value)
1 auto ValFindKey = [](const TMap<int32, FString> MapType, FString Value)->void 2 { 3 const int32* ShowFindKey = MapType.FindKey(Value); 4 UE_LOG(LogTemp, Display, TEXT("ValFindKey | Val: %s ,Key: %d"), *Value, *ShowFindKey); 5 UE_LOG(LogTemp, Display, TEXT("=============================")); 6 };
3. 查找 Key,找不到则新增
Map1.FindOrAdd(1);
1 // 先查找,如果找不到则新增 Key, Value则是空的,返回Value的引用 2 FString& FVal = Map1.FindOrAdd(1); 3 FVal = TEXT("BBB"); 4 KeyFindVal_1(Map1, 1);
4. 遍历 TMap
4.1 使用 foreach 的方式遍历 TMap
1 auto ForEachMap = [](const TMap<int32, FString>& Valu)->void 2 { 3 for (const TPair<int32, FString>& element : Valu) 4 { 5 UE_LOG(LogTemp, Display, TEXT("ForEachMap | Key: %d, Value: %s "), element.Key, *(element.Value)); 6 } 7 UE_LOG(LogTemp, Display, TEXT("=============================")); 8 };
4.2 使用迭代器的方式遍历 TMap
1 auto ForItMap = [](const TMap<int32, FString>& Valu)->void 2 { 3 for (TMap<int32, FString>::TConstIterator it = Valu.CreateConstIterator(); it; ++it) 4 { 5 UE_LOG(LogTemp, Display, TEXT("ForItMap | Key: %d, Value: %s "), it.Key(), *(it.Value())); 6 } 7 UE_LOG(LogTemp, Display, TEXT("=============================")); 8 };
5. 显示当前 Map 所有的 Key
Map1.GenerateKeyArray(KeyList);
1 // 显示当前 Map 所有的 Key 2 TArray<int32> KeyList; 3 Map1.GenerateKeyArray(KeyList); 4 if (KeyList.Num() > 0) 5 { 6 for (int32& KeyNode : KeyList) 7 { 8 UE_LOG(LogTemp, Display, TEXT("Key: %d"), KeyNode); 9 } 10 UE_LOG(LogTemp, Display, TEXT("=============================")); 11 }
6. 显示当前 Map 所有的 Value
Map1.GenerateValueArray(ValList);
1 // 显示当前 Map 所有的 Value 2 TArray <FString> ValList; 3 Map1.GenerateValueArray(ValList); 4 if (ValList.Num() > 0) 5 { 6 for (FString& ValNode : ValList) 7 { 8 UE_LOG(LogTemp, Display, TEXT("Val: %s"), *ValNode); 9 } 10 UE_LOG(LogTemp, Display, TEXT("=============================")); 11 }
7. 两个 Map 合并(相同 Key 时会覆盖旧的)
1 Map1.Append(Map2);
8. 删除指定 Key 以及元素,返回与该 Key 关联元素的个数
Map1.Remove(0)
1 // 删除指定 Key 的元素,返回与该 Key 关联值的个数 2 if (Map1.Contains(0)) 3 { 4 int32 RemoveValNum = Map1.Remove(0); 5 UE_LOG(LogTemp, Display, TEXT("RemoveValNum: %d"), RemoveValNum); 6 ForItMap(Map1); 7 }
9. 删除指定 Key 的元素,并返回删掉的元素内容
如果元素存在则会返回被删除内容的深拷贝。但会出现没有找到对应 Key 以至于抛出异常,这时候去使用他的返回值会导致内存崩掉
Map1.FindAndRemoveChecked(1);
1 // 删除指定 Key 的元素,如果元素存在则会返回被删除内容的深拷贝。但会出现没有找到对应 Key 以至于抛出异常,这时候去使用他的返回值会导致内存崩掉 2 if (Map1.Contains(1)) 3 { 4 FString FindAndRemoveString = Map1.FindAndRemoveChecked(1); 5 UE_LOG(LogTemp, Display, TEXT("FindAndRemoveString: %s"), *FindAndRemoveString); 6 ForItMap(Map1); 7 }
10. 删除指定的 Key 的元素,并将删掉的内容赋值给相同类型
如果元素存在则会将被删除元素的值赋值给传入的第二个参数,删除成功返回 True, 否则返回 False
Map1.RemoveAndCopyValue(1, RemoveAndCoryFString)
1 // 删除指定的 Key 的元素,如果元素存在则会将被删除元素的值赋值给传入的第二个参数,删除成功返回 True, 否则返回 False 2 FString RemoveAndCoryFString; 3 if (Map1.RemoveAndCopyValue(1, RemoveAndCoryFString)) 4 { 5 UE_LOG(LogTemp, Display, TEXT("RemoveAndCoryFString: %s"), *RemoveAndCoryFString); 6 ForItMap(Map1); 7 }
11. 清空 Map
1 // 清空 Map 2 Map1.Empty();
测试结果:
关于 TMap 的增删改查的全部代码
1 // Called when the game starts or when spawned 2 void ATMapActor::BeginPlay() 3 { 4 Super::BeginPlay(); 5 6 // 通过 Key 查找 value; Contains 方法 7 auto KeyFindVal_1 = [](const TMap<int32, FString> Value, int32 Key)->void 8 { 9 if (Value.Contains(Key)) 10 { 11 UE_LOG(LogTemp, Display, TEXT("Key is %d value is: %s"), Key, *Value[Key]); 12 UE_LOG(LogTemp, Display, TEXT("=============================")); 13 } 14 else 15 { 16 UE_LOG(LogTemp, Display, TEXT("Key %d is error"), Key); 17 UE_LOG(LogTemp, Display, TEXT("=============================")); 18 } 19 }; 20 21 // 通过 Find 查找 value; Find 方法 22 auto KeyFindVal_2 = [](const TMap<int32, FString> Value, int32 Key)->void 23 { 24 if (Value.Contains(Key)) 25 { 26 const FString* Vall = Value.Find(Key); 27 if (Vall != nullptr) 28 { 29 UE_LOG(LogTemp, Display, TEXT("Key is %d value is: %s"), Key, Vall->operator*()); 30 UE_LOG(LogTemp, Display, TEXT("=============================")); 31 } 32 else 33 { 34 UE_LOG(LogTemp, Display, TEXT("Key %d Ptr error"), Key); 35 UE_LOG(LogTemp, Display, TEXT("=============================")); 36 } 37 } 38 else 39 { 40 UE_LOG(LogTemp, Display, TEXT("Key %d is error"), Key); 41 UE_LOG(LogTemp, Display, TEXT("=============================")); 42 } 43 }; 44 45 // 通过 FindRef 查找 value; FindRef 方法 46 auto KeyFindVal_3 = [](const TMap<int32, FString> Value, int32 Key)->void 47 { 48 if (Value.Contains(Key)) 49 { 50 const FString Vall = Value.FindRef(Key); 51 if (&Vall != nullptr) 52 { 53 // UE_LOG(LogTemp, Display, TEXT("Key is %d value is: %s"), Key, *Vall); 两种方式都可以 54 UE_LOG(LogTemp, Display, TEXT("Key is %d value is: %s"), Key, Vall.operator*()); 55 UE_LOG(LogTemp, Display, TEXT("=============================")); 56 } 57 else 58 { 59 UE_LOG(LogTemp, Display, TEXT("Key %d Ptr error"), Key); 60 UE_LOG(LogTemp, Display, TEXT("=============================")); 61 } 62 } 63 else 64 { 65 UE_LOG(LogTemp, Display, TEXT("Key %d is error"), Key); 66 UE_LOG(LogTemp, Display, TEXT("=============================")); 67 } 68 }; 69 70 // 通过 Value 查找 Key 71 auto ValFindKey = [](const TMap<int32, FString> MapType, FString Value)->void 72 { 73 const int32* ShowFindKey = MapType.FindKey(Value); 74 UE_LOG(LogTemp, Display, TEXT("ValFindKey | Val: %s ,Key: %d"), *Value, *ShowFindKey); 75 UE_LOG(LogTemp, Display, TEXT("=============================")); 76 }; 77 78 // 遍历 TMap 79 auto ForEachMap = [](const TMap<int32, FString>& Valu)->void 80 { 81 for (const TPair<int32, FString>& element : Valu) 82 { 83 UE_LOG(LogTemp, Display, TEXT("ForEachMap | Key: %d, Value: %s "), element.Key, *(element.Value)); 84 } 85 UE_LOG(LogTemp, Display, TEXT("=============================")); 86 }; 87 88 // 使用迭代器的方式遍历 TMap 89 auto ForItMap = [](const TMap<int32, FString>& Valu)->void 90 { 91 for (TMap<int32, FString>::TConstIterator it = Valu.CreateConstIterator(); it; ++it) 92 { 93 UE_LOG(LogTemp, Display, TEXT("ForItMap | Key: %d, Value: %s "), it.Key(), *(it.Value())); 94 } 95 UE_LOG(LogTemp, Display, TEXT("=============================")); 96 }; 97 98 TMap<int32, FString> Map1; 99 TMap<int32, FString> Map2; 100 Map2.Add(0, TEXT("aaa")); 101 Map2.Add(1, TEXT("bbb")); 102 Map2.Add(2, TEXT("ccc")); 103 Map2.Add(3, TEXT("ddd")); 104 105 // 添加元素 106 Map1.Add(0, TEXT("AAA")); 107 Map1.Add(1, TEXT("bbb")); 108 Map1.Add(2, TEXT("CCC")); 109 Map1.Add(3, TEXT("DDD")); 110 Map1.Add(4, TEXT("EEE")); 111 Map1.Add(5, TEXT("FFF")); 112 113 KeyFindVal_1(Map1, 0); 114 115 // 先查找,如果找不到则新增 Key, Value则是空的,返回Value的引用 116 FString& FVal = Map1.FindOrAdd(1); 117 FVal = TEXT("BBB"); 118 KeyFindVal_1(Map1, 1); 119 120 ValFindKey(Map1, TEXT("BBB")); 121 122 123 // 显示当前 Map 所有的 Key 124 TArray<int32> KeyList; 125 Map1.GenerateKeyArray(KeyList); 126 if (KeyList.Num() > 0) 127 { 128 for (int32& KeyNode : KeyList) 129 { 130 UE_LOG(LogTemp, Display, TEXT("Key: %d"), KeyNode); 131 } 132 UE_LOG(LogTemp, Display, TEXT("=============================")); 133 } 134 135 // 显示当前 Map 所有的 Value 136 TArray <FString> ValList; 137 Map1.GenerateValueArray(ValList); 138 if (ValList.Num() > 0) 139 { 140 for (FString& ValNode : ValList) 141 { 142 UE_LOG(LogTemp, Display, TEXT("Val: %s"), *ValNode); 143 } 144 UE_LOG(LogTemp, Display, TEXT("=============================")); 145 } 146 147 // 两个 Map 合并,相同 Key 时以参数 Map 的值为准 148 Map1.Append(Map2); 149 ForEachMap(Map1); 150 151 // 删除指定 Key 的元素,返回与该 Key 关联值的个数 152 if (Map1.Contains(0)) 153 { 154 int32 RemoveValNum = Map1.Remove(0); 155 UE_LOG(LogTemp, Display, TEXT("RemoveValNum: %d"), RemoveValNum); 156 ForItMap(Map1); 157 } 158 159 // 删除指定 Key 的元素,如果元素存在则会返回被删除内容的深拷贝。但会出现没有找到对应 Key 以至于抛出异常,这时候去使用他的返回值会导致内存崩掉 160 FString FindAndRemoveString = Map1.FindAndRemoveChecked(1); 161 UE_LOG(LogTemp, Display, TEXT("FindAndRemoveString: %s"), *FindAndRemoveString); 162 ForItMap(Map1); 163 164 // 删除指定的 Key 的元素,如果元素存在则会将被删除元素的值赋值给传入的第二个参数,删除成功返回 True, 否则返回 False 165 FString RemoveAndCoryFString; 166 if (Map1.RemoveAndCopyValue(1, RemoveAndCoryFString)) 167 { 168 UE_LOG(LogTemp, Display, TEXT("RemoveAndCoryFString: %s"), *RemoveAndCoryFString); 169 ForItMap(Map1); 170 } 171 172 // 清空 Map 173 Map1.Empty(); 174 ForItMap(Map1); 175 176 }