当前位置: 首页 > news >正文

UE_C++ —— 数据类型

目录

一,基本数据类型

二,字符串类型

三,容器类型


一,基本数据类型

        UE对C++基本数据类型进行了深度重定义,并禁止使用原生的C++基本数据类型,以保证引擎的跨平台特性;

布尔类型(bool,代表布尔值,即true或false;

字符类型(TCHAR,代表字符型,用于支持宽字符(如Unicode字符集),以保证跨平台兼容性;

短整形(short,2个字节;

无符号和有符号整数类型

  • int,标准整形,根据系统架构(32位或64位)的不同,其大小可能有所不同(32位4字节、64位8字节);
  • uint8(1字节)、uint16(2字节)、uint32(4字节)、uint64(8字节)
  • int8(1字节)、int16(2字节)、int32(4字节)、int64(8字节)

长整形(long),4个字节;

长长整形(long long),8个字节;

浮点类型

  • float(单精度浮点型,4字节)
  • double(双精度浮点型,8字节)

二,字符串类型

FString,动态字符数组;

  • 用于存储可变的字符串,必须用TEXT宏包裹字符串;
  • 开销大于其他类字符串类型,是处理字符串的主要类型;

FName,资源命名字符串;

  • 用存储名称(散列存储),速度快,必须用TEXT宏包裹字符串;
  • 大小通常为8byte,只进行一次字符串哈希映射,在比较字符串时不区分大小写;
  • 常被用于存储不可变的字符串,如资源路径、资源文件类型、平台标识等;
  • 在引擎的UObject中用于储存对象名称,以提高性能;

FText,显示字符串;

  • 处理用户的显式文本,提供了对字符串进行格式化、本地化等操作的功能;
  • 大小为40bytes,核心实质是一个TSharedRef<ITextData>,即实际文本数据的智能引用;拷贝成本非常低,只需拷贝指针而不是整个字符串数据;
  • 不可变,不提供修改函数,无法进行内容修改;

//FString类
//构造与赋值
FString str1; // 创建一个空的FString对象
FString str2(TEXT("Hello")); // 使用TEXT宏创建一个包含"Hello"的FString对象
FString str3 = str2; // 通过拷贝构造函数赋值
FString str4 = TEXT("World"); // 直接使用TEXT宏进行赋值//追加
FString str = TEXT("Hello, ");
str.Append(TEXT("World!")); // 使用Append函数追加字符串,结果str为"Hello, World!"
str += TEXT(" Again!"); // 使用+=运算符追加字符串,结果str为"Hello, World! Again!"//插入
FString str = TEXT("Hello");
str.InsertAt(5, TEXT(" World")); // 在索引5的位置插入字符串" World",结果str为"Hello World"//替换
FString str = TEXT("Hello World");
str = str.Replace(TEXT("World"), TEXT("UE")); // 将"World"替换为"UE",结果str为"Hello UE"//查询
FString str = TEXT("Hello World");
bool containsHello = str.Contains(TEXT("Hello")); // 判断是否包含子字符串"Hello",结果为true
int32 index = str.Find(TEXT("World")); // 查找子字符串"World"的索引,结果为6
bool startsWithHello = str.StartsWith(TEXT("Hello")); // 判断是否以"Hello"开头,结果为true
bool endsWithWorld = str.EndsWith(TEXT("World")); // 判断是否以"World"结尾,结果为true//格式化
FString playerName = TEXT("John");
FString greeting = FString::Printf(TEXT("Hello, %s!"), *playerName); // 使用Printf函数格式化字符串,结果greeting为"Hello, John!"//路径拼接
FString basePath = TEXT("C:/Users/Documents/");
FString fileName = TEXT("example.txt");
FString fullPath = basePath / fileName; // 使用/运算符进行路径拼接,结果fullPath为"C:/Users/Documents/example.txt"FString fullPath;
fullPath.PathAppend(fileName, TEXT("example.txt").Length()); // 将文件名追加到基路径上,注意需要传递文件名的长度
//FName
//创建
FName myFName(TEXT("MyObjectName"));
//比较
if (myFName == FName(TEXT("MyObjectName")));
//FText
FText myText = TEXT("Hello, World!");
FText formattedText = FText::Format(TEXT("Hello, {0}!"), TEXT("World"));

三,容器类型

TArray,UE定义的增强数组容器;

  • 是一个同质容器,即其所有元素均完全为相同类型;
  • 与std::vector类似,可动态扩充内存;当容量满了,会额外分配一个更大的内存,并将数据拷到新内存上,之后再释放旧的内存;
  • 提供了比标准C++数组更丰富的功能,如动态扩展、排序、查找等;
  • 具有速度快、内存消耗小、安全性高等特点;

TSet,存储值本身的松散的集合;

  • 默认不允许元素重复,存储唯一元素;
  • 基于哈希表实现,提供了快速的查找、插入和删除操作;

TMap,key-value类型容器;

  • 允许通过键来快速查找对应的值,适用于需要快速访问数据的场景;
  • 基于哈希表实现,提供了高效的查找性能;
  • 键必须是唯一的,而值可以是任何类型;
//TArray
#include "Containers/Array.h"
TArray<int32> IntArray; //初始化一个空的TArray//添加元素
IntArray.Add(10);
IntArray.Add(20);
IntArray.Add(30);
IntArray.AddUnique(30);//使用索引访问元素
UE_LOG(LogTemp, Warning, TEXT("Element at index 1: %d"), IntArray[1]); //输出: Element at index 1: 20//使用范围for循环迭代元素
for (int32 i : IntArray)
{UE_LOG(LogTemp, Warning, TEXT("Element: %d"), i);
}IntArray.RemoveAt(1); //移除索引为1的元素,即20
IntArray.Empty(); //清空数组
//TSet
#include "Containers/Set.h"
TSet<int32> IntSet; //声明一个存储int32的TSet
TSet<FString> StringSet = { TEXT("Hello"), TEXT("World") }; //使用初始化列表IntSet.Add(10);
IntSet.Add(20);
IntSet.Add(10); //这个不会被添加,因为10已经存在IntSet.Contains(20); //检查TSet中是否包含某个元素
IntSet.Remove(10);
IntSet.Empty();
//TMap
#include "Containers/Map.h"
TMap<FString, int32> StringToIntMap; // 声明一个存储FString到int32映射的TMap// 初始化通常是通过Add方法
StringToIntMap.Add(TEXT("One"), 1);
StringToIntMap.Add(TEXT("Two"), 2);
StringToIntMap.Add(TEXT("Three"), 3);
StringToIntMap.Add(TEXT("One"), 10); // 这会覆盖键为"One"的值,新的值为10//查找元素
if (StringToIntMap.Contains(TEXT("Two")))
{int32 value = StringToIntMap[TEXT("Two")]; // 更常见的查找方式,但如果键不存在会触发断言(在开发构建中)// 或者使用Find来避免断言int32* valuePtr = StringToIntMap.Find(TEXT("Two"));if (valuePtr){int32 value = *valuePtr;}
}StringToIntMap.Remove(TEXT("One"));
StringToIntMap.Empty();


http://www.mrgr.cn/news/79474.html

相关文章:

  • 红日靶场vulnstack 5靶机的测试报告
  • AI 的时代,新科技和新技术如何推动跨学科的整合?
  • 016 在路由器上配置 DHCP
  • tensorflow相关
  • application.yml 和 bootstrap.yml
  • [WiFi] WiFi安全加密WEP Vs WPA Vs WPA2 Vs WPA3整理
  • 【动手学电机驱动】STM32-MBD(1)安装 STM32 硬件支持包
  • 使用IntelliJ IDEA开发Gradle插件并发布到本地
  • openharmony5.0版本源码一二级目录概览
  • 【C++游戏程序】easyX图形库还原游戏《贪吃蛇大作战》(三)
  • Scala-隐式转换
  • “切片赋值”创建列表批量操作“新”方法(Python)
  • JDK17 CompletableFuture
  • shell自动显示当前git的branch
  • [机器学习] 监督学习之线性回归与逻辑回归
  • C++ 完美转发和左值右值
  • 利用高德地图API,如何在PHP与vue3中实现地图缩放功能
  • UE5.5 Geometry库平面切割原理分析
  • Vue3+Vite+ElementPlus 构建 笔记
  • 深入理解 Spring MVC 中的 @RequestBody 注解
  • AI职位对项目经验有哪些具体要求?
  • 【力扣】647.回文子串
  • 【论文相关】期刊/会议 信息检索——IEEE各期刊投稿要求(待完善)
  • leetcode399:除法求值
  • AGCRN论文解读
  • 【调试工具】USB 转 UART 适配器(USB 转 TTL)