首页 > 其他分享 >关于 UE4 TMap

关于 UE4 TMap

时间:2023-05-14 22:55:32浏览次数:61  
标签:TMap LOG TEXT Map1 关于 Key UE UE4 Display

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 }

 

标签:TMap,LOG,TEXT,Map1,关于,Key,UE,UE4,Display
From: https://www.cnblogs.com/CooCoChoco/p/16601704.html

相关文章

  • 关于 UE4 的 TArray
    TArray,是UE4的可动态扩容数组容器,是UE4里最常见,也是用的最多的一种容器,类似于STL中的vector 1.遍历Array的三种方法1.1下标遍历Array(lambda写法)1//下标法遍历Array2autoForeach_1=[](TArray<int32>_arr)->void3{4for(int32i=0;i<_arr......
  • 关于 UE4 的 TSet
    TSet是一种快速容器类,(通常)用于在排序不重要的情况下存储唯一元素。TSet类似于TMap和TMultiMap,但有一个重要区别:TSet是通过对元素求值的可覆盖函数,使用数据值本身作为键,而不是将数据值与独立的键相关联。TSet可以非常快速地添加、查找和删除元素。默认情况下,TSet不支持重......
  • 关于 Web 可访问性的神话
    网络可访问性是每个Web开发项目中的必去之处,但对于许多Web开发人员来说,它似乎仍是个谜。就像这是传奇的东西,而不是工作所需的基本技能。围绕Web可访问性存在许多误解,大多数时候,由于对此事缺乏了解(或兴趣),这些误解都助长了这种误解。本文收集了其中一些无障碍误解或神话。无......
  • 关于Kubernetes-v1.23.6-网络组件-calico的安装部署...
    当2个workernodes节点加入到 Kubernetes/k8s集群后,我们去master节点、执行kubectlgetnodes命令就可以看到worker节点了但是我们会看到无论是master节点、还是worker节点,STATUS都会是  NotReady,如下[root@k8s-masterqq-5201351]#kubectlgetnodesNAME......
  • 关于公司岗位与责任
    运维常见岗位系统管理员(SystemAdministrator):负责管理和维护公司的计算机系统、硬件和软件设备,确保系统正常运行并提供技术支持。网络管理员/工程师(NetworkAdministrator/Engineer):负责设计、配置和维护公司的计算机网络系统,包括局域网(LAN)、广域网(WAN)以及互联网连接。数......
  • 关于Python解释器的多版本共存问题
    在日常开发项目时,总会用到多种不同版本的解释器,那如何切换解释器呢?不能卸载重装需求版本的解释器吧,如此原解释器内pip的模块也丢失掉了,那我们应该怎么做呢?首先我们要前往Python的官网:http://www.python.org然后就是安装解释器,在我的文件内安装了三款解释器,为了方便看,3.6.8的......
  • 2023/5/14 遇到关于mongodb部署的问题
    之前使用关于mongodb5的版本中,linux系统中tar解压mongodb文件夹后的bin目录中mongod是启动mongo服务,而里面默认自带一个连接mongodb的shell脚本mongo而这几天使用mongodb6的版本中发现mongo脚本没有了,去网上查看发现是mongodb发行了一个新的shell脚本工具mongosh,这个需要自己安装......
  • 一个MATLAB/Simulink模型,关于电动汽车动力电池健康状态(State of Health; 建模基于SOC估
    一个MATLAB/Simulink模型,关于电动汽车动力电池健康状态(StateofHealth;建模基于SOC估计;模型比较简单,原理清楚,适合对电动汽车动力电池SOH的估计有兴趣的初学者参考。学习前请阅读2到3篇动力电池SOH估计方面论文,这样对理解模型更有帮助。ID:48200672287533152......
  • [复习资料]关于最优化类 dp 的优化
    目录关于最优化类dp的优化决策单调性优化普通类型四边形不等式斜率优化带权二分关于最优化类dp的优化复习一下三种最优化类dp的优化方式。决策单调性优化普通类型在序列上面的dp,设最优决策点依次为\(g_{1,\dots,n}\),如果满足\(g_i\leg_{i+1}\),那么可以以此优化......
  • [复习资料]关于式子
    目录关于式子关于式子这个人开始写一些无意义的东西了。\[\sum_{i}\min_{j}a_{i,j}=\sum_{p\ge1}\prod_{i}\sum_{j}[a_{i,j}\gep]\]\[\sum_{i}\max_{j}a_{i,j}=\sum_{p\ge1}(\prod_{i}\sum_{j}1-\prod_{i}\sum_{j}[a_{i,j}<p])\]\[\lfloor\frac{n}{m}\rfloor=\frac......