UE中常用的容器


一、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 适合需要根据键快速查找、插入和删除对应值的场景。

### 解决PyCharm无法加载Conda虚拟环境的方法 #### 配置设置 为了使 PyCharm 能够成功识别并使用 Conda 创建的虚拟环境,需确保 Anaconda 的路径已正确添加至系统的环境变量中[^1]。这一步骤至关重要,因为只有当 Python 解释器及其关联工具被加入 PATH 后,IDE 才能顺利找到它们。 对于 Windows 用户而言,在安装 Anaconda 时,默认情况下会询问是否将它添加到系统路径里;如果当时选择了否,则现在应该手动完成此操作。具体做法是在“高级系统设置”的“环境变量”选项内编辑 `Path` 变量,追加 Anaconda 安装目录下的 Scripts 文件夹位置。 另外,建议每次新建项目前都通过命令行先激活目标 conda env: ```bash conda activate myenvname ``` 接着再启动 IDE 进入工作区,这样有助于减少兼容性方面的问题发生概率。 #### 常见错误及修复方法 ##### 错误一:未发现任何解释器 症状表现为打开 PyCharm 新建工程向导页面找不到由 Conda 构建出来的 interpreter 列表项。此时应前往 Preferences/Settings -> Project:...->Python Interpreter 下方点击齿轮图标选择 Add...按钮来指定自定义的位置。按照提示浏览定位到对应版本 python.exe 的绝对地址即可解决问题。 ##### 错误二:权限不足导致 DLL 加载失败 有时即使指定了正确的解释器路径,仍可能遇到由于缺乏适当的操作系统级许可而引发的功能缺失现象。特别是涉及到调用某些特定类型的动态链接库 (Dynamic Link Library, .dll) 时尤为明显。因此拥有管理员身份执行相关动作显得尤为重要——无论是从终端还是图形界面触发创建新 venv 流程均如此处理能够有效规避此类隐患。 ##### 错误三:网络连接异常引起依赖下载超时 部分开发者反馈过因网速慢或者其他因素造成 pip install 操作中途断开进而影响整个项目的初始化进度条卡住的情况。对此可尝试调整镜像源加速获取速度或是离线模式预先准备好所需资源包后再继续后续步骤。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值