0%

UE(3):容器

容器TArray

TArray 是虚幻C++中的动态数组

特点:

  1. 速度快、内存消耗小、安全性高
  2. TArray 所有元素均为完全相同类型,不能进行不同元素类型的混合
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
// 数组操作
// 1.增
MyArray.Add(10); // 将元素添加到数组中
MyArray.Add(20);
MyArray.Add(30);
MyArray.AddUnique(20); // 数组中存在相同元素就不添加
MyArray.AddUnique(40); // 数组中不存在相同元素就添加

// 2.删
MyArray.Remove(20); // 移除中数组中所有的等值元素,移除所有20
MyArray.RemoveAt(0); // 移除数组中索引值为0的元素
MyArray.RemoveSingle(10); // 移除首个匹配的等值元素
MyArray.Empty(); // 清空数组,size—>0
MyArray.Reset(); // 重置数组,size不变,所有元素变为0

// 3.改
MyArray.Insert(60, 0); // 在0号索引的位置插入元素60
int32& temp = MyArray[0];
temp = 50; // 通过变量引用修改数组元素

// 4.查
MyArray.Contains(10); // 查找数组中是否包含某个元素,返回值类型:bool
MyArray.Find(10); // 正向查找数组中匹配的第一个元素,返回值类型:bool
MyArray.FindLast(10); //反向查找数组中匹配的第一个元素,返回值类型:bool

// 5.遍历
void AMyGameMode::PrintArray()
{
// 用迭代器遍历数组并打印
for (auto It = MyArray.CreateConstIterator(); It; It++) {
UE_LOG(LogTemp, Warning, TEXT("%d"), *It);
GEngine->AddOnScreenDebugMessage(-1, 5.0f, FColor::Blue, FString::Printf(TEXT("%d"), *It));
}
}

容器TMap

TMap 是虚幻C++中的一种键值对容器

特点:

  1. 数据成对出现(Key,Value)
  2. Value通过Key获取,且Key值不能重复
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
// Map操作
// 1.增
MyMap.Emplace(0, 1); // 用法和add一样,都是往容器中添加数值
MyMap.Emplace(1, 2);
MyMap.Emplace(2, 3);

// 2.删
MyMap.Remove(0); // 移除Key为0的元素
MyMap.Empty(); // 清空容器

// 3.查找
MyMap.Contains(1); // 查找匹配的Key值,进行两次查找,返回值:bool
int32* isFind1 = MyMap.Find(2); // 通过查找匹配的Key值返回Value,只进行一次查找,返回值:指针
const int32* isFind2 = MyMap.FindKey(3); //反向查找,通过查找匹配的Value返回Key,返回值:指针
// 分别获取所有的Keys和Values
TArray<int32> TestKeys;
TArray<int32> TestValues;
MyMap.GenerateKeyArray(TestKeys);
MyMap.GenerateValueArray(TestValues);

// 4.遍历
for(auto& TestMap:MyMap){
// 获取Key:TestMap.Key,获取Value:TestMap.Value
GEngine->AddOnScreenDebugMessage(-1, 5.0f, FColor::Blue, FString::Printf(TEXT("Key:%d""Value:%d"), TestMap.Key, TestMap.Value));
UE_LOG(LogTemp, Warning, TEXT("Key:%d""Value:%d"), TestMap.Key, TestMap.Value);
}

容器TSet

Tset是一种快速容器类,通常用于排序不重要的情况下存储唯一元素

TSet类似于TMapTMultiMap,但有一个重要区别:TSet是通过对元素求值的可覆盖函数,使用数据值本身作为键

TSet可以非常快速地添加、查找和删除元素(恒定时间)

TSet也是值类型,支持常规复制、赋值和析构函数操作,以及其元素具有较强的所有权

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
// Set操作
// 1.添加元素
// add和emplace都是添加元素到容器中,但是emplace可以避免在插入集合时产生的临时文件
MySet.Add(TEXT("Banana"));
MySet.Add(TEXT("Apple"));
MySet.Emplace(TEXT("Orange"));
PrintSet();

// 2.合并元素
TSet<FString>MySet2;
MySet2.Add(TEXT("wangsen"));
MySet2.Add(TEXT("lindanqi"));
MySet.Append(MySet2); // Append将MySet2的值合并到Myset中
GEngine->AddOnScreenDebugMessage(-1,5.0f,FColor::Cyan,TEXT("=============="));
PrintSet();

// 3.移除元素
MySet.Remove(TEXT("Banana")); // remove函数会返回已删除元素的数量,如果删除的Key不在集合中则返回0
MySet.Empty(); // 清空容器,释放内存
MySet.Reset(); // 清空集合元素,但是保留内存

// 4.查找元素
int32 size = MySet.Num(); // 查询集合中保存的元素数量
bool isFind1=MySet.Contains(TEXT("Banana")); // 查询是否包含特定元素,返回值:bool
FString* isFind2 = MySet.Find(TEXT("Banana")); // Find返回的是指向元素数值的指针,如果不包含该Key则返回Null

// 5.Array函数会返回TArray,存储TSet中每个元素的副本
TArray<FString> FruitArray = MySet.Array();

// 6.排序
TSet<FString> TestSet = { TEXT("a"),TEXT("aa"),TEXT("aaa"),TEXT("aaaa") };
TestSet.Sort([](FString A, FString B) { // 参数:Lambda表达式
return A.Len() > B.Len();
});

// 7.运算符
TSet<FString>NewSet;
NewSet = MySet; // 将MySet里面的值赋值给NewSet
NewSet.Add(TEXT("One"));

// 8.[]
// 根据FSetElementId访问集合对应元素的引用并修改内容
FSetElementId Index = NewSet.Add(TEXT("Two"));
TestSet[Index] = TEXT("NewTwo");

// 9.ReServe
TSet<FString>NewSet1;
NewSet1.Reserve(10); // 预先分配内存,如果输入的Num大于存储的元素个数,则会产生闲置内存Slack

// 10.Shrink
for (int32 i = 0; i < 10; i++) {
NewSet1.Add(FString::Printf("NewSet % d", i)); // 添加元素
}
for (int32 i = 0; i < 10; i += 2) {
NewSet1.Remove(FSetElementId::FromInteger(i)); // 删除元素产生闲置内存
}
NewSet.Shrink(); // 删除末端的空元素

// 11.Compact将容器中的空白元素集合到末尾,+Shrink删除
NewSet1.Compact(); // 注意:Compact可能会改变元素之间的顺序,如果不想改变顺序,可以使用CompactStable
NewSet1.Shrink();