UE4 C++ 对结构体数组内元素进行排序

这篇博客介绍了在C++中如何对包含自定义结构体的数组进行排序。关键在于结构体需要重写小于操作符(<),并且结构体内包含可排序的属性如int或float类型变量。示例中定义了一个名为FATestActor的结构体,包含一个字符串、一个枚举和一个浮点数。结构体实现了小于操作符用于升序排序,然后在函数SortStruct中使用了TArray的Sort方法对数组进行排序。
摘要由CSDN通过智能技术生成

对结构体数组排序需要两个必要条件,一是结构体定义内重写<操作符,二是元素内必须要有可以用来排序的属性例如int、float类型的变量

案例:

.h
UENUM(BlueprintType)
enum class EOrient : uint8
{
	North,
	East,
	South,
	West,
};

USTRUCT(BlueprintType)
struct FATestActor
{
	GENERATED_USTRUCT_BODY()

public:

	UPROPERTY(EditAnyWhere, BlueprintReadWrite)
		FString str;

	UPROPERTY(EditAnyWhere, BlueprintReadWrite)
		EOrient orient;

	UPROPERTY(EditAnyWhere, BlueprintReadWrite)
		float a;

	bool operator<(const FATestActor& ATestActor) const
	{
        //>是从大到小排序,<就是从小到大
		return a > ATestActor.a;
	}
};

public:
    UFUNCTION(BlueprintCallable)
		void SortStruct(const TArray<FATestActor>& ArrayStruct);

public:
    UPROPERTY(EditAnyWhere, BlueprintReadWrite)
		TArray<FATestActor> testArrayStruct;
.cpp
void ATestActors::SortStruct(const TArray<FATestActor>& ArrayStruct)
{
    //const_cast<>()去掉const修饰符才能对数组进行更改
	const_cast<TArray<FATestActor>&>(ArrayStruct).Sort();
}

UE4中,我们可以使用C++结构体数组来存储一组相关的数据。下面是一个简单的示例,展示如何定义和使用结构体数组: 首先,我们定义一个包含两个字段的结构体: ```c++ USTRUCT(BlueprintType) struct FMyStruct { GENERATED_BODY() UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "MyStruct") int32 id; UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "MyStruct") FString name; }; ``` 然后,我们可以定义一个结构体数组来存储多个 FMyStruct 对象: ```c++ USTRUCT(BlueprintType) struct FMyStructArray { GENERATED_BODY() UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "MyStructArray") TArray<FMyStruct> myStructs; }; ``` 在上面的例子中,我们定义了一个名为 FMyStructArray 的结构体,它包含一个 TArray 类型的 myStructs 字段,用于存储 FMyStruct 对象。 我们可以在代码中使用结构体数组,如下所示: ```c++ FMyStructArray myArray; // 初始化结构体数组 for (int i = 0; i < 10; i++) { FMyStruct myStruct; myStruct.id = i; myStruct.name = FString::Printf(TEXT("Item %d"), i+1); myArray.myStructs.Add(myStruct); } // 遍历结构体数组 for (int i = 0; i < myArray.myStructs.Num(); i++) { FMyStruct myStruct = myArray.myStructs[i]; UE_LOG(LogTemp, Warning, TEXT("Item %d: id=%d, name=%s"), i+1, myStruct.id, *myStruct.name); } ``` 在上面的代码中,我们首先创建了一个 FMyStructArray 类型的 myArray 对象,然后使用一个 for 循环来初始化它。最后,我们再次使用 for 循环遍历结构体数组,并打印每个元素的 id 和 name 字段。 注意,如果我们定义了一个 USTRUCT,那么我们需要使用 GENERATED_BODY() 宏来生成相关的代码,否则编译会出错。同时,我们还需要使用 UPROPERTY 宏来指定结构体数组元素可以在蓝图中进行编辑和读取。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值