风蚀之月

UE4算法帮助类笔记

16 Dec 2017 UE4 Algo Sort

UE4有提供一套算法帮助类,命名空间为Algo,对于需要快速使用的情况可以参考。

当前使用的UE4版本为4.18.2。

整个Algo的定义分散在各个文件中,按照功能区分进行分布。

在定义上全部都是模板函数,通用性比较强。

数据整理

这一块是对内存数据块进行整理的通用模板。

Copy

这是一个系列的拷贝模板函数,主要的工作就是对数据进行拷贝。

有一个CopyIf的变体,只会把符合条件的数据拷贝到目标中去。

通常需要拷贝的容器是Arrat,Map之类的,对于这个模板,只要保证源容器实现了range for和目标容器实现了Add函数就可以了。

当然,数据的类型必须至少是可转换的类型。

TArray<int> TestArray;
TArray<int> TestData;
Algo::Copy(TestData, TestArray);

Transform

对数据进行某种操作,并填充到目标。

也有这Transfor_If的变体,要求传入的Transform操作必须返回要填充到目标的类型。

Algo::Transform(TestData, TestArray, [](int i) { return FMath::DegreesToRadians(i); });
check(TestArray.Num() == NUM_TEST_OBJECTS);
for (int i = 0; i < TestArray.Num(); ++i)
{
   check(TestArray[i] == FMath::DegreesToRadians(TestData[i]));
}

这里由于源与目标的数据类型可以是不一致的,再加上有If变体,其实是一个非常好用的数据批量处理模板。

这里传入的if条件和转置条件即可以是成员的指针也可以是成员的函数,在使用的时候可以灵活的采用。

二分搜索

内部封装的二分搜索算法,不用每次想要进行搜索的时候临时到Google或者代码库中去翻找搜索算法的代码了。

提供一下三个基本的函数

BinarySearch

LowerBound

UpperBound

功能就如同函数名称一样,是搜索,最小值和最大值的查找。

排序

封装了几个排序算法,不过由于排序算法早就还给课本了,在这里就不比较性能了。

毕竟一直使用std的sort也没怎么关心过其内部实现,虽然TArray也是有封装sort操作的,这里也就不去看其实现了。

整体的排序上,有一个Algo::IsSorted()函数可以用于检查数据是否已经经过了排序。

同时排序算法都有提供SortBy的变体以方便进行更加精致的排序。

Heap

严格的来说也提供了不是排序的部分。这里引用一下Wiki

a heap is a specialized tree-based data structure

给和我一样一下子想不起来Heap到底是什么的筒子。

可以Algo::Heapify(TestArray)来将一个数组转换为Heap,同时提供了IsHeap函数来检查一个数组是否是以Heap的形式保存的。

然后Algo::HeapSort()才是进行堆排序的,其结果满足Algo::IsHeap以及Algo::IsSorted。

另外,根据资料显示,[HeapSort并不是一个stable的排序算法],记得TArray是有提供StableSort的,果然其内部应该是有别的排序实现的。

IntroSort

这个可以明确的记得当初并没有学过呢,再次引用Wiki

Introsort or introspective sort is a hybrid sorting algorithm that provides both fast average performance and (asymptotically) optimal worst-case performance.

似乎是叫内省排序总之是相当优秀的排序算法,只是不是Stable的。

Sort

直接调用Sort就可以了,Unstable,并没有解释到底用的是什么算法。也没有去关注它的实现……