一、TArray(动态数组)
- 用途:类似 std::vector,支持动态扩容和随机访问。
TArray<int32> Numbers;
Numbers.Add(42); // 添加元素
Numbers.Emplace(10); // 原地构造元素
Numbers.Remove(42); // 删除元素
int32 First = Numbers[0]; // 随机访问
底层数据结构
TArray 是一个动态数组,其底层使用连续的内存块来存储元素。它的实现类似于标准模板库STL中的 std::vector。
原理详解
- 内存分配:当创建 TArray 时,会分配一定大小的初始内存块来存储元素。随着元素的不断添加,如果当前内存块不足以容纳新元素,TArray 会重新分配一块更大的内存块,将原有的元素复制到新的内存块中,并释放原有的内存块。通常,新分配的内存块大小会比原内存块大,以减少频繁的内存重新分配。
- 元素访问:由于元素存储在连续的内存块中,因此可以通过下标直接访问元素,时间复杂度为O(1)。
- 插入和删除操作
- 尾部插入:在数组尾部插入元素通常是高效的,时间复杂度为 O(1),除非需要重新分配内存。
- 中间或头部插入:在数组中间或头部插入元素时,需要将插入位置之后的所有元素向后移动,时间复杂度为 O(n),其中 n 是数组的元素数量。
- 删除操作:删除元素时,同样需要移动后续元素,时间复杂度也为 O(n)。
二、TSet(无序集合)
- 用途:存储唯一元素,基于哈希表,快速查找。
TSet<FString> UniqueStrings;
UniqueStrings.Add(TEXT("UE5")); // 添加元素
bool bContains = UniqueStrings.Contains(TEXT("UE5")); // 检查存在性
UniqueStrings.Remove(TEXT("UE5")); // 删除元素
底层数据结构
TSet 是一个无序集合,底层通常使用哈希表(Hash Table)来实现。哈希表通过哈希函数将元素的键映射到一个固定大小的数组中的某个位置。
原理详解
- 哈希函数:TSet 使用哈希函数将元素的键转换为一个整数,该整数作为哈希表数组的索引。理想情况下,哈希函数能够将元素均匀地分布在哈希表中,减少哈希冲突的发生。
- 哈希冲突处理:当两个不同的元素通过哈希函数映射到相同的位置时,就会发生哈希冲突。TSet 通常使用链地址法(Chaining)来处理哈希冲突,即在每个哈希表数组位置上维护一个链表或其他数据结构,将冲突的元素存储在该链表中。
- 元素查找、插入和删除操作
- 查找:通过哈希函数计算元素的哈希值,定位到哈希表中的相应位置,然后在该位置的链表中查找元素。平均时间复杂度为 (O(1)),但在最坏情况下(所有元素都映射到同一个位置),时间复杂度为 (O(n))。
- 插入:首先计算元素的哈希值,找到对应的位置,然后检查该位置是否已经存在相同的元素。如果不存在,则将元素插入到链表中。平均时间复杂度为 (O(1))。
- 删除:同样先计算元素的哈希值,定位到相应位置,然后在链表中查找并删除该元素。平均时间复杂度为O(1)。
三、TMap(哈希表)
- 用途:键值对存储,键唯一,类似 std::unordered_map。
TMap<FString, int32> ScoreMap;
ScoreMap.Add(TEXT("Player1"), 100); // 添加键值对
ScoreMap.Emplace(TEXT("Player2"), 200); // 原地构造
int32* Score = ScoreMap.Find(TEXT("Player1")); // 查找值
ScoreMap.Remove(TEXT("Player1")); // 删除键
底层数据结构
TMap 是一个键值对映射容器,底层同样使用哈希表来实现,类似于 TSet。不同之处在于,TMap 存储的是键值对(Key - Value),而 TSet 只存储单一元素。
原理详解
- 哈希函数和键值对存储:TMap 使用哈希函数对键进行计算,将键映射到哈希表的某个位置。每个位置存储一个键值对,当发生哈希冲突时,同样使用链地址法处理。
- 元素查找、插入和删除操作
- 查找:根据键计算哈希值,定位到哈希表中的位置,然后在该位置的链表中查找具有相同键的键值对。平均时间复杂度为 O(1)。
- 插入:计算键的哈希值,检查该位置是否已经存在相同的键。如果不存在,则插入新的键值对;如果存在,则可以选择更新该键对应的值。平均时间复杂度为 O(1)。
- 删除:根据键计算哈希值,定位到相应位置,在链表中查找并删除具有该键的键值对。平均时间复杂度为O(1)。
总结
综上所述,TArray 适合需要快速随机访问元素的场景;TSet 适合需要快速判断元素是否存在的场景;TMap 适合需要根据键快速查找、插入和删除对应值的场景。