UE5 C++(四)— 容器(TArray,TMap,TSet)

文章目录

  • 数组(TArray)
  • TMap
  • TSet

数组(TArray)

TArray是虚幻c++中的动态数组,TArray特点:速度快,内存消耗小,安全性高。并且TArray所有元素均完全为相同类型,不能进行不同元素类型的混合

在蓝图中创建数组
在这里插入图片描述
在C++中创建数组

/**
 *
 */
UCLASS()
class DEMO_API AMyGameMode : public AGameMode
{
	GENERATED_BODY()
	AMyGameMode();

public:
	// 游戏开始时执行一次
	virtual void BeginPlay() override;
	// 游戏运行时每帧执行一次
	virtual void Tick(float DeltaTime) override;
	// 游戏结束h或者切换关卡时执行一次
	virtual void EndPlay(const EEndPlayReason::Type EndPlayReason) override;

	//TArrayTArray是虚幻c++中的动态数组TArray特点:速度快,内存消耗小,安全性高。并且TArray所有元素均完全为相同类型,不能进行不同元素类型的混合
	TArray<int32> m_Int32Array;

	void PrintTArray();
};
#include "MyGameMode.h"

AMyGameMode::AMyGameMode()
{
    DefaultPawnClass = AMyPawn::StaticClass();
    HUDClass = AMyHUD::StaticClass();
    PlayerControllerClass = AMyPlayerController::StaticClass();
    GameStateClass = AMyGameState::StaticClass();
    PlayerStateClass = AMyPlayerState::StaticClass();
}

void AMyGameMode::BeginPlay()
{
    Super::BeginPlay();
    // 数组操作
    // 添加元素到数组中
    m_Int32Array.Add(10);
    m_Int32Array.Add(20);
    m_Int32Array.Add(30);
    m_Int32Array.AddUnique(30); // 数组中不存在30,添加成功,存在30,添加失败
    // 删除所有等值的元素
    m_Int32Array.Remove(20);
    // 删除指定索引的元素
    m_Int32Array.RemoveAt(0);
    // 删除数组中第一个30,如果数组中有多个30,只删除第一个
    m_Int32Array.RemoveSingle(30);
    m_Int32Array.Empty(); // 清空数组
    m_Int32Array.Reset(); // 重置我们的元素所有变为0
    // 修改
    m_Int32Array.Insert(60,0); // 在索引0处插入60
    int32& value = m_Int32Array[0]; // 获取索引0处的值
    value = 100; // 修改索引0处的值为100    
    //查找
    int32 index = m_Int32Array.Find(100); // 查找100的索引  
    m_Int32Array.Contains(100); // 查找数组中是否包含100
    int32 index = m_Int32Array.FindLast(100);// 查找最后一个100的索引

    PrintTArray();
}

void AMyGameMode::Tick(float DeltaTime)
{
    Super::Tick(DeltaTime);
}

void AMyGameMode::EndPlay(const EEndPlayReason::Type EndPlayReason)
{
    Super::EndPlay(EndPlayReason);
}

void AMyGameMode::PrintTArray()
{
    // 遍历数组
    for (int32 i = 0; i < m_Int32Array.Num(); i++)
    {
        // 打印数组元素 到日志
        UE_LOG(LogTemp, Warning, TEXT("m_Int32Array[%d] = %d"), i, m_Int32Array[i]);
    }
    // 使用迭代器遍历数组
    for (auto It = m_Int32Array.CreateIterator(); It; ++It)
    {
        // 打印数组元素到屏幕上
        GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Green, FString::Printf(TEXT("m_Int32Array[%d] = %d"), It.GetIndex(), *It));
    }
}

在这里插入图片描述

TMap

TMap-是一种键值对容器,里面的数据都是成对出现的(Key,Value),Value通过Key值来获取,且Key值不能重复,key值唯一。

在蓝图中创建TMap
在这里插入图片描述

在C++中创建TMap

UCLASS()
class DEMO_API AMyGameMode : public AGameMode
{
	GENERATED_BODY()
	AMyGameMode();

public:
	// 游戏开始时执行一次
	virtual void BeginPlay() override;
	// 游戏运行时每帧执行一次
	virtual void Tick(float DeltaTime) override;
	// 游戏结束h或者切换关卡时执行一次
	virtual void EndPlay(const EEndPlayReason::Type EndPlayReason) override;

	// TMap-是一种键值对容器,里面的数据都是成对出现的(Key,Value),Value通过Key值来获取,且Key值不能重复,key值唯一。
	TMap<int32, int32> m_Map;

	void PrintTMap();
};
// Fill out your copyright notice in the Description page of Project Settings.
#include "MyGameMode.h"
AMyGameMode::AMyGameMode()
{
    DefaultPawnClass = AMyPawn::StaticClass();
    HUDClass = AMyHUD::StaticClass();
    PlayerControllerClass = AMyPlayerController::StaticClass();
    GameStateClass = AMyGameState::StaticClass();
    PlayerStateClass = AMyPlayerState::StaticClass();
}

void AMyGameMode::BeginPlay()
{
    Super::BeginPlay();
    // TMap操作
    // 添加元素到TMap中
    m_Map.Add(1, 10);
    m_Map.Emplace(2, 20);
    m_Map.Emplace(3, 30);
    
    // 删除元素
    m_Map.Remove(2); // 删除key为2的元素
    m_Map.Empty();   // 清空TMap

    // 查找
    m_Map.Contains(1);                          // 查找TMap中是否包含key为1的元素
    int32 *findValue = m_Map.Find(1);           // 查找key为1的元素
    const int32 *findValue2 = m_Map.FindKey(1); // 查找value为1的元素
    m_Map.FindRef(1);                           // 查找key为1的元素的引用
    //分别获取所有的Keys和Values
    TArray<int32> keys;
    TArray<int32> values;
    m_Map.GenerateKeyArray(keys);
    m_Map.GenerateValueArray(values);
    
    PrintTMap();
}

void AMyGameMode::Tick(float DeltaTime)
{
    Super::Tick(DeltaTime);
}

void AMyGameMode::EndPlay(const EEndPlayReason::Type EndPlayReason)
{
    Super::EndPlay(EndPlayReason);
}
void AMyGameMode::PrintTMap()
{
  for(auto& elem : m_Map)
  {
  //打印日志
    UE_LOG(LogTemp, Warning, TEXT("m_Map[%d] = %d"), elem.Key, elem.Value);
    //打印到屏幕上
    GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Green, FString::Printf(TEXT("m_Map[%d] = %d"), elem.Key, elem.Value));
  }
}

在这里插入图片描述

TSet

  • TSet-TSet是一种快速容器类,(通常)用于在排序不重要的情况下存储唯一元素。
  • TSet类似于TMap和TMultiMap,但有一个重要区别:TSet是通过对元素求值的可覆盖函数,使用数据值本身作为键,而不是将数据值与独立的键相关联。
  • TSet可以非常快速地添加、查找和删除元素(恒定时间)。
  • TSet也是值类型,支持常规复制、赋值和析构函数操作,以及其元素较强的所有权。

在蓝图中创建TSet
在这里插入图片描述

/**
 *
 */
UCLASS()
class DEMO_API AMyGameMode : public AGameMode
{
	GENERATED_BODY()
	AMyGameMode();

public:
	// 游戏开始时执行一次
	virtual void BeginPlay() override;
	// 游戏运行时每帧执行一次
	virtual void Tick(float DeltaTime) override;
	// 游戏结束h或者切换关卡时执行一次
	virtual void EndPlay(const EEndPlayReason::Type EndPlayReason) override;

	TSet<FString> m_Set;
	void PrintTSet();
};
// Fill out your copyright notice in the Description page of Project Settings.

#include "MyGameMode.h"

AMyGameMode::AMyGameMode()
{
    DefaultPawnClass = AMyPawn::StaticClass();
    HUDClass = AMyHUD::StaticClass();
    PlayerControllerClass = AMyPlayerController::StaticClass();
    GameStateClass = AMyGameState::StaticClass();
    PlayerStateClass = AMyPlayerState::StaticClass();
}

void AMyGameMode::BeginPlay()
{
    Super::BeginPlay();
    // TSet操作
    // 添加元素到TSet中
    m_Set.Add(TEXT("A"));
    m_Set.Add(TEXT("B"));
    m_Set.Emplace(TEXT("C")); // add和Emplace的区别是,Emplace可以避免在插入集时创建的临时对象,从而提高性能

    // 合并元素
    TSet<FString> setTemp;
    setTemp.Add(TEXT("D"));
    setTemp.Add(TEXT("E"));
    m_Set.Append(setTemp);

    // 删除元素
    m_Set.Remove(TEXT("A")); // 删除元素A
    m_Set.Reset();           // 重置TSet 清空集合元素但会保留内存
    m_Set.Empty();           // 清空TSet 并释放内存

    // 查找元素
    int32 count = m_Set.Num();                  // 获取TSet中元素的个数
    bool isContain = m_Set.Contains(TEXT("A")); // 查找TSet中是否包含元素A
    FString *value = m_Set.Find(TEXT("A"));     // 查找元素A

    // 转化为TArray
    TArray<FString> array = m_Set.Array(); // 填充了Tset中的所有元素副本

    // 排序 从小到大
    TSet<FString> setTemp2 = {TEXT("a"), TEXT("aa"), TEXT("aaa")};
    setTemp2.Sort([](const FString &A, const FString &B)
                  { return A.Len() < B.Len(); });

    // 运算符
    TSet<FString> setTemp3;
    setTemp3 = m_Set;
    setTemp3.Add(TEXT("F"));

    //[]
    FSetElementId id = setTemp3.Add(TEXT("G")); // 根据FSetElementId访问集合对应元素的引用
    m_Set[id] = TEXT("H");

    // ReServe
    TSet<FString> setTemp4;
    setTemp4.Reserve(10); // 预留10个元素的空间 ,若输入的参数大于当前元素个数,则重新分配内存,否则不做任何操作

    // Shrink
    for (int32 i = 0; i < 10; i++)
    {
        setTemp4.Add(FString::FromInt(i));
    }
    for (int32 i = 0; i < 10; i++)
    {
        setTemp4.Remove(FString::FromInt(i));
    }
    // 删除元素后,释放内存
    setTemp4.Shrink();

    // Compact 将容器中的所有空白的元素集合到一起,然后一起删除
    setTemp4.Compact();
    setTemp4.Shrink();

    PrintTSet();
    PrintTSet();
}

void AMyGameMode::Tick(float DeltaTime)
{
    Super::Tick(DeltaTime);
}

void AMyGameMode::EndPlay(const EEndPlayReason::Type EndPlayReason)
{
    Super::EndPlay(EndPlayReason);
}

void AMyGameMode::PrintTSet()
{
     UE_LOG(LogTemp, Warning, TEXT("%s"), "PrintTSet");
    for (auto &elem : m_Set)
    {
        UE_LOG(LogTemp, Warning, TEXT("%s"), *elem);
        GEngine->AddOnScreenDebugMessage(-1, 5.f, FColor::Blue, FString::Printf(TEXT("%s"), *elem));
    }
}

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数字图像处理(实践篇)二十四 使用dlib实现人脸对齐

目录 1 安装依赖库 2 下载shape_predictor_68_face_landmarks.dat文件 3 人脸对齐方案 4 涉及的函数 5 实践 1 安装依赖库 使用如下命令即可安装dlib: pip install dlib 在使用

【Qt之QNetworkAccessManager】概述及示例

概述 QNetworkAccessManager类允许应用程序发送网络请求和接收应答 网络访问API是围绕一个QNetworkAccessManager对象构建的&#xff0c;该对象为它发送的请求保存通用配置和设置。它包含代理和缓存配置&#xff0c;以及与此类问题相关的信号&#xff0c;以及可用于监视网络操…

读书笔记-《数据结构与算法》-摘要5[归并排序]

归并排序 核心&#xff1a;将两个有序对数组归并成一个更大的有序数组。通常做法为递归排序&#xff0c;并将两个不同的有序数组归并到第三个数组中。 先来看看动图&#xff0c;归并排序是一种典型的分治应用。 public class MergeSort {public static void main(String[] ar…

Unity Mono加密解决方案

Unity Mono 是 Unity 引擎默认的脚本运行时环境&#xff0c;在游戏开发中扮演着重要的角色。Mono 由跨平台的开源 .NET 框架实现&#xff0c;它允许开发者使用 C# 等编程语言编写游戏逻辑。凭借简单易用的开发环境和高效的脚本编译速度&#xff0c;得到了众多游戏的青睐。 在 …

C语言数据结构-二叉树的入门

文章目录 0 碎碎念1 二叉树的概念和结构1.1 概念和特点1.2 结构1.3 特殊的二叉树1.4 二叉树的存储与性质1.5 前序、中序和后序 2 简单二叉树的实现2.1 定义数据结构类型2.2 前序、中序和后序接口的实现2.3 二叉树中节点的个数2.4 叶子节点的个数 3 完整代码块3.1 BinaryTree.h3…

Pycharm2023安装

PyCharm是一种Python IDE&#xff08;集成开发环境&#xff09;&#xff0c;带有一整套可以帮助用户在使用Python语言开发时提高其效率的工具&#xff0c;比如调试、语法高亮、项目管理、代码跳转、智能提示、自动完成、单元测试、版本控制。此外&#xff0c;该IDE提供了一些高…

亚马逊云科技发布企业生成式AI助手Amazon Q,助力企业迈向智能化时代

&#xff08;声明&#xff1a;本篇文章授权活动官方亚马逊云科技文章转发、改写权&#xff0c;包括不限于在 亚马逊云科技开发者社区、知乎、自媒体平台、第三方开发者媒体等亚马逊云科技官方渠道&#xff09; 一、前言 随着人工智能技术的快速发展和广泛应用&#xff0c;我们…

WTF ‘Questions‘

WTF ‘Tech Team Lead’ As a Tech Team Lead, your role is to oversee the technical aspects of a project or team, and to provide guidance, support, and leadership to your team members. Here are some key responsibilities and aspects of the role: Leadership …

ChatGLM大模型推理加速之Speculative Decoding

目录 一、推测解码speculative decoding 1、自回归解码 2、speculative decoding 3、细节理解 二、核心逻辑代码 1、算法流程代码 2、模型自回归代码 a、带缓存的模型自回归实现代码 b、优化版本带缓存的模型自回归实现代码 c、ChatGLM的past_key_values的回滚 三、…

C/C++: 数据结构之索引查找(分块查找)

画图举例&#xff1a; #include<bits/stdc.h> using namespace std; /** * * Author:HackerHao * Create:2023.12.14 * */ typedef struct {int Key;int Link; }indextype;//分块查找 int IndexSequelSearch(indextype ls[], int s[], int m, int Key) //关键字为Key, 索…

云原生架构总结-读书笔记

云原生架构进阶实战-读书笔记 云原生概念 云原生&#xff08;Cloud Native&#xff09;概念是由Pivotal的Matt Stine在2013年首次提出的。这个概念得到了社区的不断完善&#xff0c;内容越来越丰富&#xff0c;目前已经**包括了DevOps&#xff08;Development和Operations的组…

云计算:Vmware 安装 FusionCompute

目录 一、理论 1.FusionCompute 二、实验 1.Vmware 安装 FusionCompute&#xff08;CNA&#xff09; 2.Vmware 安装 FusionCompute&#xff08;VRM&#xff09; 三、问题 1. VRM-WEB登录失败 2.Windows cmd中无法ping通虚拟机 一、理论 1.FusionCompute &#xff08;…

LangChain(0.0.340)官方文档九:Retrieval——Text embedding models、Vector stores、Indexing

LangChain官网、LangChain官方文档 、langchain Github、langchain API文档、llm-universe 文章目录 一、Text embedding models1.1 Embeddings类1.2 OpenAI1.3 Sentence Transformers on Hugging Face1.4 CacheBackedEmbeddings1.4.1 简介1.4.2 与Vector Store一起使用1.4.3 内…

保障事务隔离级别的关键措施

目录 引言 1. 锁机制的应用 2. 多版本并发控制&#xff08;MVCC&#xff09;的实现 3. 事务日志的记录与恢复 4. 数据库引擎的实现策略 结论 引言 事务隔离级别是数据库管理系统&#xff08;DBMS&#xff09;中的一个关键概念&#xff0c;用于控制并发事务之间的可见性。…

TikTok与虚拟现实的完美交融:全新娱乐时代的开启

TikTok&#xff0c;这个风靡全球的短视频平台&#xff0c;与虚拟现实&#xff08;VR&#xff09;技术的深度结合&#xff0c;为用户呈现了一场全新的娱乐盛宴。虚拟现实技术为TikTok带来了更丰富、更沉浸的用户体验&#xff0c;标志着全新娱乐时代的开启。本文将深入探讨TikTok…

Tomcat部署(图片和HTML等)静态资源时遇到的问题

文章目录 Tomcat部署静态资源问题图中HTML代码启动Tomcat后先确认Tomcat是否启动成功 Tomcat部署静态资源问题 今天&#xff0c;有人突然跟我提到&#xff0c;使用nginx部署静态资源&#xff0c;如图片。可以直接通过url地址访问&#xff0c;为什么他的Tomcat不能通过这样的方…

持续集成交付CICD:Jenkins使用基于SaltStack的CD流水线下载Nexus制品

目录 一、理论 1.salt常用命令 二、实验 1.SaltStack环境检查 2.Jenkins使用基于SaltStack的CD流水线下载Nexus制品 二、问题 1.salt未找到命令 2.salt简单测试报错 3. wget输出日志过长 一、理论 1.salt常用命令 &#xff08;1&#xff09;salt 命令 该 命令执行s…

回答一个同学的问题:在目前深度学习爆火的年代,专家系统还有用吗,会被淘汰吗?

文章目录 我的看法如下&#xff1a;&#xff08;不会被淘汰&#xff0c;会逐渐进化&#xff09;总结 我的看法如下&#xff1a;&#xff08;不会被淘汰&#xff0c;会逐渐进化&#xff09; 专家系统和深度学习有其各自的优势。专家系统利用规则和知识库来给出结论,适用于问题范…

There appears to be trouble with your network connection. Retrying

一直在报如上错误&#xff0c;试了很多办法&#xff0c;比如删掉yarn.lock&#xff0c;yarn cache clean&#xff0c;删掉node_modules&#xff0c;rm proxy等等都没有用 甚至于重启电脑&#xff0c;然而并没有什么用 突然间想到&#xff0c;我用了clash for window 所以想了…

Redis权限管理体系(一):客户端名及用户名

在Redis6之前的版本中&#xff0c;因安全认证的主要方式是使用Redis实例的密码进行基础控制&#xff0c;而无法按照不同的应用来源配置不同账号以及更细粒度的操作权限控制来管理。本文先从client list中的信息入手&#xff0c;逐步了解Redis的客户端名设置、用户设置及权限控制…