UE4 中 TMap<>与TArray<>的全遍历,及带条件删除

本文介绍了如何在UnrealEngine4(UE4)中使用TMap和TArray数据结构进行正向和逆向遍历,并附带条件删除元素,包括注意事项和示例代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、UE4 中,TMap<int32,int32> 正向遍历,带条件删除。

注意点:在调用 Remove(it->Key);之后,it 并不会自动往后移动,仍然需要调用 ++it,才会指向下一个值。

	// TMap<> 正向遍历,带条件删除。
	TMap<int32, int32> aaaa;
	aaaa.Add(1, 2);
	aaaa.Add(16, 2);
	aaaa.Add(7, 2);
	aaaa.Add(5, 2);
	aaaa.Add(26, 2);
	aaaa.Add(2, 2);
	aaaa.Add(4, 2);
	aaaa.Add(8, 2);
	aaaa.Add(6, 2);
	TMap<int32, int32>::TIterator it = aaaa.CreateIterator();
	for (; it; ++it)
	{
		int32 nn = it->Key;
		if (it->Key == 7 || it->Key == 2 || it->Key == 8)
		{
			aaaa.Remove(it->Key);
		}
	}

二、UE4 中,TArray<> 正向遍历,带条件删除。

注意点:在调用 RemoveAt(i) 之后,不能执行 i++,否则会漏掉一个元素的访问。

	// TArray<> 正向遍历,带条件删除。
	TArray<int32> ArrInt = { 3,6,1,3,7,2,9,8,6 };
	for (int32 i = 0; i < ArrInt.Num();)
	{
		int32 nTemp = ArrInt[i];
		if (nTemp == 1 || nTemp == 7 || nTemp == 8)
		{
			ArrInt.RemoveAt(i);
			continue;
		}
		i++;
	}

三、UE4 中,TArray<> 逆向遍历,带条件删除。

注意点:这里删除后,没有特殊操作,也是推荐的删除方法。

	// TArray<> 逆向遍历,带条件删除。
	TArray<int32> ArrIntR = { 3,6,1,3,7,2,9,8,6 };
	for (int32 j = ArrIntR.Num() - 1; j >= 0; j--)
	{
		int32 nTemp = ArrIntR[j];
		if (nTemp == 1 || nTemp == 7 || nTemp == 8)
		{
			ArrIntR.RemoveAt(j);
		}
	}

<think>好的,我现在需要解释TArray<TSharedPtr<FJsonValue>>这个类型。首先,我应该拆解每个部分,看看用户可能对哪些部分不熟悉。 TArray是Unreal Engine里的动态数组模板类,对吧?用户可能知道C++的std::vector,但TArray是UE自己实现的,功能类似但可能有不同的方法或优化。需要简单说明TArray的作用,比如动态扩容、内存管理等。 然后是TSharedPtr,这是UE的智能指针,基于引用计数。用户可能了解std::shared_ptr,但UE有自己的实现,比如线程安或者和UE其他系统的集成。需要解释TSharedPtr的作用,比如自动管理对象生命周期,避免内存泄漏。 接着是FJsonValue,这是UE的JSON库的类,用来表示JSON的各种值类型,比如字符串、数字、对象、数组等。需要说明FJsonValue的作用,以及为什么用指针来存储,可能是因为多态性,不同的子类处理不同类型的数据。 组合起来,TArray<TSharedPtr<FJsonValue>>就是一个动态数组,每个元素都是指向FJsonValue的共享指针。这样的结构在解析或构建JSON数据时常用,比如处理JSON数组的多个元素,每个元素可以是不同类型,通过智能指针管理内存,避免手动释放。 用户可能想知道为什么用TSharedPtr而不是原始指针,或者裸指针。这时候需要强调内存安,智能指针自动释放资源,避免内存泄漏。另外,可能UE的JSON API要求使用这种指针,比如返回或接收智能指针类型的对象。 可能还需要举例说明,比如解析一个JSON数组,每个元素都被包装成FJsonValue的共享指针,并存储在TArray。或者构建这样的数组,添加各种类型的FJsonValue对象,然后序列化成JSON字符串。 另外,可能需要注意UE版本差异,但用户没有提到特定版本,所以假设是最新的稳定版。如果有常见的错误或使用注意事项,比如循环引用导致的内存泄漏,或者线程安问题,但TSharedPtr是否是线程安的?需要确认UE的文档,默认情况下可能不是,但用户可能需要知道这点。 总结结构的话,先分解每个模板参数,解释各自的作用,然后整体说明这个类型的用途和典型使用场景。可能还需要提到相关的其他类,比如FJsonObject、FJsonSerializer等,说明如何配合使用。</think>TArray<TSharedPtr<FJsonValue>> 是虚幻引擎(Unreal Engine)用于处理JSON数据的复合类型。以下逐步解析其结构和用途: --- ### 1. **分解类型结构** #### (a) `TArray<T>` - **作用**:虚幻引擎的动态数组模板类(类似C++的`std::vector`)。 - **特点**: - 自动管理内存分配和扩容。 - 提供增删查改等常用操作(如`Add()`, `RemoveAt()`, `Find()`)。 - 性能优化,与UE其他容器(如`TMap`)深度集成。 #### (b) `TSharedPtr<T>` - **作用**:虚幻引擎的共享指针(类似C++的`std::shared_ptr`)。 - **特点**: - 基于引用计数自动管理对象生命周期。 - 线程安(引用计数操作通过原子操作保证)。 - 支持自定义删除器(Deleter),适应特定资源释放逻辑。 #### (c) `FJsonValue` - **作用**:UE的JSON库(`Json`模块)表示JSON值的基类。 - **派生类**: - `FJsonValueString`:字符串类型。 - `FJsonValueNumber`:数值类型。 - `FJsonValueBoolean`:布尔类型。 - `FJsonValueObject`:嵌套的JSON对象(`TSharedPtr<FJsonObject>`)。 - `FJsonValueArray`:嵌套的JSON数组(`TArray<TSharedPtr<FJsonValue>>`)。 - **多态性**:通过指针实现不同类型值的统一存储。 --- ### 2. **组合后的意义** `TArray<TSharedPtr<FJsonValue>>` 表示一个**动态数组**,其每个元素是: - 一个指向`FJsonValue`的共享指针。 - 可安存储任意JSON类型(字符串、数字、对象、数组等)。 - 自动管理内存,避免手动释放资源。 --- ### 3. **典型应用场景** #### (a) **解析JSON数组** 假设JSON数据如下: ```json [42, "Hello", {"Key": "Value"}] ``` 解析后的内存结构: $$ \text{TArray}[ \;\; \text{TSharedPtr}(FJsonValueNumber(42)), \;\; \text{TSharedPtr}(FJsonValueString("Hello")), \;\; \text{TSharedPtr}(FJsonValueObject(...)) \;\; ] $$ #### (b) **构建JSON数组** ```cpp TArray<TSharedPtr<FJsonValue>> JsonArray; // 添加数值 JsonArray.Add(MakeShared<FJsonValueNumber>(42)); // 添加字符串 JsonArray.Add(MakeShared<FJsonValueString>("Hello")); // 序列化为JSON字符串 FString OutputString; TSharedRef<TJsonWriter<>> Writer = TJsonWriterFactory<>::Create(&OutputString); FJsonSerializer::Serialize(JsonArray, Writer); ``` #### (c) **遍历与类型检查** ```cpp for (const TSharedPtr<FJsonValue>& Value : JsonArray) { if (Value->Type == EJson::String) { FString StrValue = Value->AsString(); } else if (Value->Type == EJson::Number) { double NumValue = Value->AsNumber(); } } ``` --- ### 4. **注意事项** - **类型安**:需通过`FJsonValue::Type`字段显式检查实际类型,避免错误转换。 - **循环引用**:若JSON对象间存在循环引用,需手动打破引用或使用弱指针(`TWeakPtr`)。 - **性能**:频繁操作大型数组时,优先使用`TArray`预分配(`Reserve()`)减少扩容开销。 --- ### 5. **相关类型** - `FJsonObject`:表示JSON对象,存储键值对(`TMap<FString, TSharedPtr<FJsonValue>>`)。 - `FJsonSerializer`:提供JSON序列化与反序列化方法(如`Serialize()`/`Deserialize()`)。 如需进一步探讨具体操作(如解析嵌套对象),可提供示例代码说明。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值