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

关于 UE4 的 TArray

时间:2023-05-14 22:55:26浏览次数:26  
标签:Arr LOG TEXT arr Display 关于 UE UE4 TArray

TArray,是UE4的可动态扩容数组容器,是UE4里最常见,也是用的最多的一种容器,类似于STL中的vector

 

1. 遍历Array的三种方法

1.1 下标遍历Array(lambda写法)

1 // 下标法遍历 Array
2     auto Foreach_1 = [](TArray<int32> _arr)->void
3     {
4         for (int32 i = 0; i < _arr.Num(); i++)
5         {
6             UE_LOG(LogTemp, Display, TEXT("Foreach_1: arr[%d] == %d"), i, _arr[i]);
7         }
8         UE_LOG(LogTemp, Display, TEXT(" ========================= "));
9     };

 

1.2 foreach 遍历Array(lambda写法)

 1     // foreach 遍历 Array
 2     auto Foreach_2 = [](TArray<int32> _arr)->void
 3     {
 4         if (_arr.Num() > 0)
 5         {
 6             for (int32 val : _arr)
 7             {
 8                 UE_LOG(LogTemp, Display, TEXT("Foreach_2: arr == %d"), val);
 9             }
10             UE_LOG(LogTemp, Display, TEXT(" ========================= "));
11         }
12     };

 

1.3 迭代器遍历Array(lambda写法)

 1     // 迭代器遍历 Array
 2     auto Foreach_3 = [](TArray<int32> _arr)->void
 3     {
 4         if (_arr.Num() > 0)
 5         {
 6             for (TArray<int32>::TConstIterator it = _arr.CreateConstIterator(); it; ++it)
 7             {
 8                 UE_LOG(LogTemp, Display, TEXT("Foreach_3: arr == %d"), *it);
 9             }
10             UE_LOG(LogTemp, Display, TEXT(" ========================= "));
11         }
12     };

 

 

2. Array 的操作

 

    这里所有代码时放置到Actor对象的BeginPlay方法中执行的,并且这里会使用上方的迭代器遍历Array

 1 void AArrayActor::BeginPlay()
 2 {
 3     Super::BeginPlay();
 4 
 5     // 下标法遍历 Array
 6     auto Foreach_1 = [](TArray<int32> _arr)->void
 7     {
 8         for (int32 i = 0; i < _arr.Num(); i++)
 9         {
10             UE_LOG(LogTemp, Display, TEXT("Foreach_1: arr[%d] == %d"), i, _arr[i]);
11         }
12         UE_LOG(LogTemp, Display, TEXT(" ========================= "));
13     };
14 
15     // foreach 遍历 Array
16     auto Foreach_2 = [](TArray<int32> _arr)->void
17     {
18         if (_arr.Num() > 0)
19         {
20             for (int32 val : _arr)
21             {
22                 UE_LOG(LogTemp, Display, TEXT("Foreach_2: arr == %d"), val);
23             }
24             UE_LOG(LogTemp, Display, TEXT(" ========================= "));
25         }
26     };
27 
28     // 迭代器遍历 Array
29     auto Foreach_3 = [](TArray<int32> _arr)->void
30     {
31         if (_arr.Num() > 0)
32         {
33             for (TArray<int32>::TConstIterator it = _arr.CreateConstIterator(); it; ++it)
34             {
35                 UE_LOG(LogTemp, Display, TEXT("Foreach_3: arr == %d"), *it);
36             }
37             UE_LOG(LogTemp, Display, TEXT(" ========================= "));
38         }
39     };
40 
41     TArray<int32> Arr;
42     TArray<int32> Arr_2;
43     Arr_2.Init(88, 1);
44     // 初始化
45     Arr.Init(1, 2);                           // 初始化内存,初始化类型为int32,每个内存的数据为2,一共初始化3个int32
46     Foreach_3(Arr);
47     
48 
49     // 增加元素,返回 Index
50     Arr.Add(2);                                    // Add 提供了引用和右值引用两个版本,会将元素插入到数组的最后位置,并返回元素的Index,内部实现都是通过 CheckAddress() 检查参数有效性并调用Emplace函数。
51     Arr.Emplace(3);                                // Emplace 只有右值引用版本,在数组的末尾构造一个新项,可能会重新分配整个数组以适应。也是 Add 调用的方法,Add 只是比他多了数据有效性检查。
52     Arr.Push(4);                                  // 为了方便C语言语法所存在的方法。其源码分引用与右值引用两个版本。其实现是直接调用 Add 方法
53     Foreach_3(Arr);
54 
55     // 将另一个数组添加到数组(大批量添加)
56     Arr.Append(Arr_2);                            // 大批量Add时可以使用,参数为另一个数组。注意右值参数的版本,内部实现可以看到不能避免新分配内存
57     Arr += Arr_2;                                 // 与AppEnd一样,大批量添加元素时可以使用
58     Foreach_3(Arr);
59 
60     // 指定位置添加
61     Arr.Insert(0, 3);                            // 将元素0添加到指定下标3的位置,同样这个函数提供了包括右值,GetRef多个版本方便使用。
62     Foreach_3(Arr);
63     
64     // 增加元素,返回增加元素的引用,与上方的Add Emplace 内部实现是一致的,唯一区别是返回值是元素的引用而不是元素的Index
65     Arr.Add_GetRef(5);                            // 提供了引用与右值应用两个版本,返回新插入元素的引用;在参数传入后先检查了安全性,然后调用了 Emplace_GetRef
66     Arr.Emplace_GetRef(6);                        // 在数组的末尾构造一个新项,可能会重新分配整个数组以适应。也是 Add_GetRef 调用的方法,Add_GetRef 只是比他多了数据有效性检查。
67     Foreach_3(Arr);
68     
69     // 增加元素,保证插入的元素不是重复的,如果重复就返回已经存在的那个Index
70     Arr.AddUnique(6);
71     Arr.AddUnique(7);
72     Arr.AddUnique(8);
73     Foreach_3(Arr);
74 
75     // 删除元素
76     Arr.Remove(1);                                // 删除与参数相等的所有参数,其是用 RemoveAll 实现的
77     Foreach_3(Arr);
78     Arr.RemoveAll([](const int32 &vel) {return vel < 4; });        // 删除所有符合条件的元素
79     Foreach_3(Arr);
80     Arr.RemoveAt(0, 2, true);                    // 删除指定位置区间的参数,三个参数:1. 从下标几开始。2. 删除几个元素。3. 删除后的内存是否需要释放。
81     Foreach_3(Arr);
82     Arr.RemoveAtSwap(0, 2, true);                //在对数组元素的顺序要求不是那么高的情况下,可以使用这个 RemoveAtSwap 函数。这个函数和RemoveAt不同的是在移除之后将数组最后一个元素挪到删除的位置而其他元素位置都保持不变这样就不存在遍历移动的耗时操作了,对于性能要求很高但顺序要求不高的场合下,用这个函数性能会更好一些。
83     Foreach_3(Arr);
84 
85     // 查找元素
86     UE_LOG(LogTemp, Display, TEXT("(7)Index = %d"), Arr.Find(7));        // 查找元素在Array中的下标位置,查找到返回下标,否则返回-1
87     UE_LOG(LogTemp, Display, TEXT("(8)Index = %d"), Arr.Find(8));
88     UE_LOG(LogTemp, Display, TEXT("(9)Index = %d"), Arr.Find(9));
89 }

 

打印结果:

  

 

2.2 关于 TArry 的排序

 1 TArray<int32> KeyList;
 2     KeyList.Add(1);
 3     KeyList.Add(0);
 4     KeyList.Add(3);
 5     KeyList.Add(5);
 6     KeyList.Add(2);
 7     KeyList.Add(4);
 8     if (KeyList.Num() > 0)
 9     {
10         for (int32 KeyNode : KeyList)
11         {
12             UE_LOG(LogTemp, Display, TEXT("Key: %d"), KeyNode);
13         }
14         UE_LOG(LogTemp, Display, TEXT("======================"));
15 
16         // 使用 Array 的 Sort (快速排序) 排序后重新输出,排序参数是lambda,< 为升序排序,>为降序排序
17         KeyList.Sort([](int32 A, int32 B)->bool {return A < B; });
18         for (int32 KeyNode : KeyList)
19         {
20             UE_LOG(LogTemp, Display, TEXT("Sort       | Key: %d"), KeyNode);
21         }
22         UE_LOG(LogTemp, Display, TEXT("======================"));
23 
24         // 使用 Array 的 HeapSort (堆排序) 排序后重新输出,排序参数是lambda,< 为升序排序,>为降序排序
25         KeyList.HeapSort([](int32 A, int32 B)->bool {return A > B; });
26         for (int32 KeyNode : KeyList)
27         {
28             UE_LOG(LogTemp, Display, TEXT("HeapSort   | Key: %d"), KeyNode);
29         }
30         UE_LOG(LogTemp, Display, TEXT("======================"));
31 
32         // 使用 Array 的 StableSort () 排序后重新输出,排序参数是lambda,< 为升序排序,>为降序排序
33         KeyList.StableSort([](int32 A, int32 B)->bool {return A < B; });
34         for (int32 KeyNode : KeyList)
35         {
36             UE_LOG(LogTemp, Display, TEXT("StableSort | Key: %d"), KeyNode);
37         }
38         UE_LOG(LogTemp, Display, TEXT("======================"));
39     }

打印结果

 

标签:Arr,LOG,TEXT,arr,Display,关于,UE,UE4,TArray
From: https://www.cnblogs.com/CooCoChoco/p/16591121.html

相关文章

  • 关于 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......
  • [复习资料]关于自动机
    目录关于自动机关于AC自动机(ACAM)关于后缀自动机(SAM)关于回文自动机(PAM)关于子序列自动机关于自动机总结一下自动机。关于AC自动机(ACAM)以下是基础:在具体实现中ACAM存了两个东西fail[]son[][],其中fail[]表示的是某个结点表示的字符串的最长的满足在Trie树上面出现过的......