首页 > 其他分享 >关于 UE4 的 TSet

关于 UE4 的 TSet

时间:2023-05-14 22:55:08浏览次数:42  
标签:Set TSet 元素 Add 关于 SetNum UE4 Foreach

  • TSet是一种快速容器类,(通常)用于在排序不重要的情况下存储唯一元素。
  • TSet 类似于 TMap 和 TMultiMap,但有一个重要区别:TSet 是通过对元素求值的可覆盖函数,使用数据值本身作为键,而不是将数据值与独立的键相关联。
  • TSet 可以非常快速地添加、查找和删除元素。默认情况下,TSet 不支持重复的键,但使用模板参数可激活此行为。
  • TSet 也是值类型,支持常规复制、赋值和析构函数操作。TSet 被销毁时,其元素也将被销毁。键类型也必须是值类型。
  • TSet 会直接使用 运算符== 比较元素,使用 GetTypeHash 对其进行散列,然后使用标准的堆分配器

为了测试 TSet 的打印,我将测试代码放到了一个 Actor 的 BginPlay 方法中进行打印测试,代码如下:

 其使用了迭代器 与 For Each 两种遍历方法

  1 // Called when the game starts or when spawned
  2 void ASetActor::BeginPlay()
  3 {
  4     Super::BeginPlay();
  5 
  6     // 迭代器遍历 TSet
  7     auto Foreach = [](TSet<int32> _arr)->void
  8     {
  9         if (_arr.Num() > 0)
 10         {
 11             for (TSet<int32>::TConstIterator it = _arr.CreateConstIterator(); it; ++it)
 12             {
 13                 UE_LOG(LogTemp, Display, TEXT("Foreach: SetNum == %d"), *it);
 14             }
 15             UE_LOG(LogTemp, Display, TEXT(" ========================= "));
 16         }
 17     };
 18 
 19     // foreach 遍历 TSet
 20     auto Foreach_2 = [](TSet<int32> _arr)->void
 21     {
 22         if (_arr.Num() > 0)
 23         {
 24             for (auto val : _arr)
 25             {
 26                 UE_LOG(LogTemp, Display, TEXT("Foreach_2: SetNum == %d"), val);
 27             }
 28             UE_LOG(LogTemp, Display, TEXT(" ========================= "));
 29         }
 30     };
 31 
 32     TSet<int32> SetNum_1;
 33     TSet<int32> SetNum_2;
 34     TSet<int32> SetNum_3;
 35     TSet<int32> SetNum_4;
 36     SetNum_1.Add(1);
 37     SetNum_1.Add(22);
 38     SetNum_1.Add(333);
 39     SetNum_2.Add(2);
 40     SetNum_3.Add(3);
 41     SetNum_4.Add(4);
 42     SetNum_4.Add(1324);
 43 
 44     // 增加元素  
 45     // 此处的元素按插入顺序排列,但不保证这些元素在内存中实际保留此排序。如果是新集合,可能会保留插入排序,但插入和删除的次数越多,新元素不出现在末尾的可能性越大。
 46     SetNum_1.Add(111);                                // 向集合中添加一个元素,返回值是一个bool的指针,该指针的设置取决于元素是否已经在 Set 中,参数传入后会直接调用 Emplace 方法
 47     Foreach(SetNum_1);
 48     SetNum_2.Emplace(111);                            // 向集合中添加一个元素,参数是要转发给 Set 构造函数的参数。返回值是一个bool的指针,该指针的设置取决于元素是否已经在 Set 中,该方法也是 Add 调用的方法。
 49     Foreach(SetNum_2);
 50     
 51     // Set 合并
 52     SetNum_1.Append(SetNum_2);                        // 将另一个集合中的所有项添加到当前的集合中,联合而不是新建一个集合存储。其实现方式为分配内存后使用ForEach Add 添加
 53     Foreach(SetNum_1);
 54 
 55     // Set 交集
 56     SetNum_1 = SetNum_1.Intersect(SetNum_2);        // 交集后只保存双方都存在的元素,其结果在返回值中,并不会改变参与判断的两个 Set
 57     Foreach(SetNum_1);
 58 
 59     // Set 并集
 60     SetNum_1 = SetNum_1.Union(SetNum_3);            // 只从参数 Set 中取当前 Set 没有的元素合并,其结果在返回值中,并不会改变参与判断的两个 Set
 61     Foreach(SetNum_1);
 62 
 63     // 查询集合中元素的数量
 64     UE_LOG(LogTemp, Display, TEXT(" SetNum_1.Num(): %d "), SetNum_1.Num());
 65     Foreach(SetNum_1);
 66 
 67     // 查询是否包含某个元素
 68     if (SetNum_1.Contains(1))
 69     {
 70         UE_LOG(LogTemp, Display, TEXT("SetNum_1.Contains(1) == Ture"));
 71         Foreach(SetNum_1);
 72     }
 73     else
 74     {
 75         UE_LOG(LogTemp, Display, TEXT("SetNum_1.Contains(1) == False"));
 76         Foreach(SetNum_1);
 77     }
 78     
 79     // 查找元素,如果存在则返回元素指针
 80     int32* Num = SetNum_1.Find(2);
 81     if (Num)
 82     {
 83         UE_LOG(LogTemp, Display, TEXT(" int32* Num = SetNum_1.Find(2)== Ture  Num = %d "), *Num);
 84         Foreach(SetNum_1);
 85     }
 86     else
 87     {
 88         UE_LOG(LogTemp, Display, TEXT(" int32* Num == NULL "));
 89         Foreach(SetNum_1);
 90     }
 91 
 92     // 删除元素
 93     SetNum_1.Remove(2);                                //     删除集合中与指定键匹配的所有元素。参数为要删除的数。其返回值是删除元素的个数。
 94     Foreach(SetNum_1);
 95 
 96 
 97     // 删除所有元素
 98     SetNum_1.Empty();                                // 将集合中所有元素清空;其参数为预留空间数量,给后边加入的元素预留,参数默认是0
 99     SetNum_1.Reset();                                // 与 Empty 不同的是,Reset 删除完所有元素后会保留所有空间
100     Foreach(SetNum_1);
101 
102 }

 打印结果

  

 

标签:Set,TSet,元素,Add,关于,SetNum,UE4,Foreach
From: https://www.cnblogs.com/CooCoChoco/p/16595021.html

相关文章

  • 关于 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......
  • [复习资料]关于自动机
    目录关于自动机关于AC自动机(ACAM)关于后缀自动机(SAM)关于回文自动机(PAM)关于子序列自动机关于自动机总结一下自动机。关于AC自动机(ACAM)以下是基础:在具体实现中ACAM存了两个东西fail[]son[][],其中fail[]表示的是某个结点表示的字符串的最长的满足在Trie树上面出现过的......
  • 关于SpringBoot应用的启动状态检查
    关于SpringBoot启动状态的检查背景:当项目由多个SpringBoot的jar包构成,为简化启动流程,写了一个启动脚本,执行脚本的start命令即可启动多个SpringBoot的jar包。原先的启动状态的判断是使用进程号和端口号来判断的,但是这种判断方式对于SpringBoot程序来说并不准确。当服务器的内存为......