阿赵UE引擎C++编程学习笔记——常用容器TArray、TMap和TSet

  大家好,我是阿赵
  这次来熟悉一下UE引擎在写C++时的一些特定的容器。
主要有三种,分别是TArray、TMap和TSet

一、 TArray

  TArray是标准的数组,通过下标来访问内容。数组里面的元素是可以重复的。
  以下是TArray的一些用法举例:

//构造
TArray<int> arr = { 1,2,3,4,5,6,7 };
//添加
arr.Add(8);
//当数组里面没有时添加
arr.AddUnique(7);
//在某个位置插入,注意,第一个参数是插入的值,第二个参数是插入位置,如果插入位置大于长度,会崩溃
arr.Insert(99, 2);
TArray<int> arr2 = { 8,9,9,9,10,11,12 };
//把另外一个TArray拼接进来
arr.Append(arr2);
//删除数组里面的全部某个元素
arr.Remove(9);
//删除数组里面第一个出现符合的元素
arr.RemoveSingle(8);
//删除某个下标位置的元素
arr.RemoveAt(1);//自定义条件删除元素
arr.RemoveAll([](const int val) {return val < 5; });//查找第一个出现某个元素的位置
int index = arr.Find(99);
//查找最后一个出现某个元素的位置
int lastIndex = arr.FindLast(99);
//判断数组是否包含某个元素
bool isContain = arr.Contains(99);//Sort 基于快速排序,是不稳定的排序;
//HeapSort 基于堆排序,是不稳定的排序;
//StableSort 基于归并排序,是稳定的排序。//从小到大排序
arr.Sort();
//自定义条件排序
arr.Sort([](const int A, const int B){return A > B;});arr.HeapSort([](const int A, const int B){return A > B;});arr.StableSort([](const int A, const int B){return A > B;});//数组长度
UE_LOG(LogTemp, Display, TEXT("num:%d"), arr.Num());
//待分配长度
UE_LOG(LogTemp, Display, TEXT("Slack:%d"), arr.GetSlack());
//数组已申请内存长度
UE_LOG(LogTemp, Display, TEXT("Max:%d"), arr.Max());
//3种遍历
for (int val : arr)
{UE_LOG(LogTemp, Display, TEXT("%d"), val);
}for (int i = 0; i < arr.Num(); i++)
{UE_LOG(LogTemp, Display, TEXT("%d"), arr[i]);
}for (auto it = arr.CreateIterator();it;++it)
{UE_LOG(LogTemp, Display, TEXT("%d"), *it);
}//清空数组,并释放内存
arr.Empty();
//重置数组,但不释放已经申请的内存
arr.Reset();

二、 TMap

  TMap是使用Key和Value配对的字典。
  以下是TMap的用法举例

//构造
TMap<FString,int> map;
//添加或修改元素
map.Add(TEXT("A"), 10);
map.Add(TEXT("B"), 11);
map.Add(TEXT("C"), 12);
map.Add(TEXT("D"), 13);
map.Emplace(TEXT("B"), 20);//修改元素
map.Emplace(TEXT("C"), 16);
//移除元素
map.Remove(TEXT("D"));
//移除某个key,并把值保存下来
int copyVal = 0;
map.RemoveAndCopyValue(TEXT("C"), copyVal);
//判断是否为空
bool isEmpty = map.IsEmpty();
//获取元素个数
int count = map.Num();
UE_LOG(LogTemp, Display, TEXT("num:%d"),count);
//是否包含
bool isContain = map.Contains(TEXT("B"));
//查找某个Key的元素
int32 *index = map.Find(TEXT("B"));
//查找某个Value的元素
const FString *keyIndex = map.FindKey(20);
//查找某个key的元素的引用
int rIndex = map.FindRef(TEXT("B"));UE_LOG(LogTemp, Display, TEXT("Find:%d:%s:%d"), *index,*(*keyIndex),rIndex);//合并另外一个TMap
TMap<FString, int> map2;
map2.Add(TEXT("AA"), 101);
map2.Add(TEXT("BB"), 102);
map2.Add(TEXT("CC"), 103);
map.Append(map2);//将TMap移动到另外一个TMap,原TMap清空
TMap<FString, int> map3;
map3 = MoveTemp(map);//获取所有key和value的列表
TArray<FString> keys;
TArray<int> values;
map.GenerateKeyArray(keys);
map.GenerateValueArray(values);
//遍历
for (auto& item : map3)
{UE_LOG(LogTemp, Display, TEXT("%s:%d"), *item.Key, item.Value);
}for (auto It = map3.CreateIterator(); It; ++It)
{UE_LOG(LogTemp, Display, TEXT("%s:%d"), *It.Key(), It.Value());
}
//清空
map.Empty();
map.Reset();

三、 TSet

  TSet是一种特殊的字典,它不是以下标作为Key,而是用Value本身作为Key。所以TSet里面的元素是不能重复的。
  以下是TSet的用法举例:

//构建
TSet<FString> strSet = { TEXT("a"),TEXT("d") };
//添加元素
strSet.Add(TEXT("c"));
strSet.Add(TEXT("b"));
strSet.Emplace("f");
//由于key就是值,所以重复添加是不会产生2个的
strSet.Add(TEXT("b"));//把另一个TSet合并,合并后的顺序没有保证
TSet<FString> strSet2 = { TEXT("x"),TEXT("y"),TEXT("n"),TEXT("e") };
strSet.Append(strSet2);//移除某个值,返回移除的数量,如果没有包含,则返回0
int removeCount = strSet.Remove(TEXT("n"));strSet.Sort([](const FString& A, const FString& B){return A > B;});//是否包含某个元素
bool isContain = strSet.Contains(TEXT("x"));//查找某个值,如果找不到会返回nullptr
FString* val = strSet.Find(TEXT("r"));
if (val == nullptr)
{UE_LOG(LogTemp, Display, TEXT("find:%s"), TEXT("nullptr"));
}
else
{UE_LOG(LogTemp, Display, TEXT("find:%s"), *(*val));
}
//转TArray
TArray<FString> strArr = strSet.Array();
//求交集
TSet<FString> strSet3 = strSet.Intersect(strSet2);
//求并集
TSet<FString> strSet4 = strSet.Union(strSet2);
//求strSet不在strSet2里面的元素集合
TSet<FString> strSet5 = strSet.Difference(strSet2);
//判断strSet是否包含strSet2
bool isInclude = strSet.Includes(strSet2);
//遍历
for (auto& item : strSet)
{UE_LOG(LogTemp, Display, TEXT("%s"), *item);
}for (auto It = strSet.CreateIterator(); It; ++It)
{UE_LOG(LogTemp, Display, TEXT("%s"), *(*It));
}
//清空
strSet.Empty();
strSet.Reset();

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/14785.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vue连接mqtt实现收发消息组件超级详细

基本概念&#xff1a; MQTT&#xff08;Message Queuing Telemetry Transport&#xff09;是一种基于发布/订阅模式的轻量级消息传输协议&#xff0c;专为低带宽、高延迟或不稳定的网络环境设计。以下是MQTT实现收发消息的基本原理&#xff1a; 客户端-服务器模型&#xff1a…

快速排序详解——多种实现方式

快速排序 快速排序是一种交换排序&#xff0c;是基于二叉树结构的交换排序方法&#xff0c;基本思想如下&#xff1a; 任取待排序元素序列中的某元素作为基准值&#xff0c;按照该排序码将待排序集合分割成两子序列&#xff0c;左子序列中所有元素均小于基准值&#xff0c;右子…

亚信安慧AntDB:可靠的数据处理和存储工具

AntDB数据库具有高性能、高可用性和高扩展性等诸多优点&#xff0c;能够高效应对庞大数据存储和处理需求&#xff0c;同时保障数据的安全和稳定。不论是企业级业务系统还是政府信息管理平台&#xff0c;AntDB都能够轻松胜任&#xff0c;展现出其强大的适应能力和可靠性。 其强…

数据量较小的表是否有必要添加索引问题分析

目录 前言一、分析前准备1.1、准备测试表和数据1.2、插入测试数据1.3、测试环境说明 二、具体业务分析2.1、单次查询耗时分析2.2、无索引并发查询服务器CPU占用率分析2.3、添加索引并发查询服务器CPU占用率分析 三、总结 前言 在一次节日活动我们系统访问量到达了平时的两倍&am…

【小沐学GIS】GDAL库安装和使用(C++、Python)

文章目录 1、简介2、下载和编译&#xff08;C&#xff09;2.1 二进制构建2.1.1 Conda2.1.2 Vcpkg 2.2 源代码构建2.2.1 nmake.opt方式构建2.2.2 generate_vcxproj.bat方式构建 2.3 命令行测试2.3.1 获取S57海图数据 2.4 代码测试2.4.1 读取tiff信息 3、Python3.1 安装3.2 测试3…

零基础入门篇④ 初识Python(注释、编码规范、关键字...)

Python从入门到精通系列专栏面向零基础以及需要进阶的读者倾心打造,9.9元订阅即可享受付费专栏权益,一个专栏带你吃透Python,专栏分为零基础入门篇、模块篇、网络爬虫篇、Web开发篇、办公自动化篇、数据分析篇…学习不断,持续更新,火热订阅中🔥专栏订阅地址 👉Python从…

C语言:通讯录管理系统的实现

如何来实现通信录呢&#xff1f; 人的信息包括&#xff1a;名字年龄性别电话地址&#xff0c;等来表示 想要实现的功能&#xff1a; 1、默认存放100个人的信息 2、增加联系人信息 3、删除指定联系人信息 4、查找联系人信息 5、修改联系人信息 6、对联系人信息排序 7、显示联系人…

C语言 | Leetcode C语言题解之第110题平衡二叉树

题目&#xff1a; 题解&#xff1a; int height(struct TreeNode* root) {if (root NULL) {return 0;}int leftHeight height(root->left);int rightHeight height(root->right);if (leftHeight -1 || rightHeight -1 || fabs(leftHeight - rightHeight) > 1) {…

Fortran: select type

Fortran: select type 实现类似C的template函数功能 module M_reduceuse mpi_f08interface reducemodule procedure reduce_scalar,reduce_arrayend interface reducecontains!!https://docs.open-mpi.org/en/v5.0.x/man-openmpi/man3/MPI_Reduce.3.htmlsubroutine reduce_ar…

Android硬件渲染环境初始化

Android硬件渲染环境初始化 一.硬件加速渲染的开启1.ThreadedRenderer的初始化2.RenderProxy的创建 二.RenderProxy中组件的初始化1.RenderThread的创建2.CanvasContext的创建3.DrawFrameTask的初始化 三.RenderThread的启动1.RenderThread中组件的初始化2.RenderThread中任务的…

arXiv AI 综述列表(2024.05.20~2024.05.24)

公众号&#xff1a;EDPJ&#xff08;进 Q 交流群&#xff1a;922230617 或加 VX&#xff1a;CV_EDPJ 进 V 交流群&#xff09; 每周末更新&#xff0c;完整版进群获取。 Q 群在群文件&#xff0c;VX 群每周末更新。 目录 1. Beyond Traditional Single Object Tracking: A …

基于yolov2深度学习网络的昆虫检测算法matlab仿真,并输出昆虫数量和大小判决

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022A 3.部分核心程序 .......................................................... for i 1:12 % 遍历结…

播兔短剧模板:图鸟UI在前端短剧平台中的应用与实践

一、引言 随着移动互联网的快速发展&#xff0c;短剧平台因其短小精悍、内容丰富的特点&#xff0c;逐渐成为用户休闲娱乐的新宠。为了满足短剧平台对前端技术的需求&#xff0c;图鸟播兔短剧模板应运而生。该模板基于图鸟UI进行开发&#xff0c;采用纯前端技术&#xff0c;支…

layui-左侧递归菜单-js实现

完整代码 两种下拉风格 <!DOCTYPE html> <html lang"en"><head><meta charset"utf-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><title>Document</title>…

【C语言回顾】文件操作

前言1. 文件打开模式2. 示例代码2.1 打开和关闭文件2.2 读写文件2.3 二进制文件操作 结语 #include<GUIQU.h> int main { 上期回顾: 【C语言回顾】动态内存管理 个人主页&#xff1a;C_GUIQU 专栏&#xff1a;【C语言学习】 return 一键三连; } 前言 各位小伙伴大家好&…

美国空军出版物:网络空间作战

这份文件是《AIR FORCE DOCTRINE PUBLICATION 3-12: CYBERSPACE OPERATIONS》&#xff0c;即美国空军教义出版物3-12&#xff0c;关于网络空间作战。 该文件详细阐述了美国空军在网络空间领域的组织、规划、执行、评估以及相关的政策、角色和责任。 以下是其核心内容的概述&a…

搜索引擎索引是什么

搜索引擎索引是搜索引擎中的关键组件&#xff0c;用于存储和管理网页、文档、图片等信息&#xff0c;并提供快速的检索功能。索引包括索引基础、单词词典、倒排列表、建立索引、动态索引、索引更新策略、查询处理、多字段索引、短语查询和分布式索引。 索引基础&#xff1a;索…

特定情况下docker run --restart=always重启失效的情况

特定情况下解决cicd中docker run --restartalways重启失效的情况_c 执行exit后 restartalways失效-CSDN博客

分享:怎么才能保证大数据查询的准确性?

随着大数据应用到金融风控领域&#xff0c;大数据越来越重要了&#xff0c;很多朋友在查大数据的时候都会遇到一个问题&#xff0c;那就是自己查询的大数据什么信息都没有&#xff0c;要么就是很少&#xff0c;这是什么原因呢?要怎么才能保证大数据查询的准确性呢?下面小编就…

给JTextArea添加右键菜单

给JTextArea添加右键菜单 package jTextarea;import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent;import javax.swing.JMenuItem; import javax.swing.JPopupMenu; import jav…