从 std 容器到 UE 容器:第一天练习记录
日期:2026-08-20
学习章节:01 C++ 语言基础
今日目标
- 理解标准库与 STL 的关系
- 掌握
TArray/TMap/FString与std::vector/std::map/std::string的对应关系 - 搞清数组连续内存、越界防护和链表差异
今天学了什么
- STL 是 C++ 标准库的子集,特指容器、迭代器、算法那套模板组件。
TArray是连续内存动态数组,内部有Data/ArrayNum/ArrayMax,扩容时会搬移元素。TArray在 Development 构建有越界断言,Shipping 构建不检查,不能依赖它当防线。TMap是无序哈希映射,查找平均 O(1),需要有序时用TSortedMap。FString/FName/FText用途不同:运行时文本、不可变标识、本地化显示。- 数组访问远快于链表;UE 中
TDoubleLinkedList接近std::list,但日常用得少。
关键代码
TArray<FString>Names;Names.Add(TEXT("Alice"));if(Names.IsValidIndex(0)){UE_LOG(LogTemp,Warning,TEXT("%s"),*Names[0]);}TMap<FName,int32>Kills;Kills.FindOrAdd(FName(TEXT("Rifle")))+=1;踩坑记录
- UE 字符串字面量必须用
TEXT("..."),否则是char不是TCHAR。 TMap不保证遍历顺序,不能假设按插入顺序输出。TArray扩容会让旧引用失效,批量添加前先Reserve。
收获与反思
容器不只是 API 记忆,更重要的是内存模型。理解了“连续内存 + 扩容搬移”之后,很多性能问题和越界问题都能自己推出来。
E01 类型与转换:第一道 C++ 练习
日期:2026-08-20
学习章节:01 C++ 语言基础
今日目标
- 完成 E01 类型与转换练习
- 用
static_cast显式转换并观察精度丢失
今天学了什么
int/float/double/bool/char的转换规则- float 约 7 位有效数字,double 约 15-17 位
- 整数除法
7 / 2 == 3 INT_MAX + 1溢出回绕为-2147483648TruncateToInt与RoundToInt的负数边界
关键代码
intRoundToInt(doublevalue){intint_value=static_cast<int>(value);doublefraction=value-int_value;if(fraction>=0.5){returnint_value+1;}elseif(fraction<=-0.5){returnint_value-1;}returnint_value;}踩坑记录
- 输出多个值不能用逗号,要用
<<链式连接。 - 负数四舍五入时
-2.5要返回-3,不是-2。fraction <= -0.5 误写为fraction < -0.5 - 文件编码混用 GBK 会引发
C4819和调试异常,统一 UTF-8。 - Debug 构建没有 PDB 时断点不触发,需要
/Zi和/DEBUG。
收获与反思
类型转换不只是语法,更要关注精度、截断和边界条件。
明日计划
- E02 引用与指针。