[{"data":1,"prerenderedAt":210},["ShallowReactive",2],{"\u002F2017-12-16-ue4-algo-note":3},{"id":4,"title":5,"body":6,"date":186,"description":12,"extension":187,"meta":188,"navigation":191,"path":203,"seo":204,"stem":205,"tags":206,"__hash__":209},"blogs\u002F_legacy\u002F2017\u002F2017-12-16-ue4-algo-note.md","UE4算法帮助类笔记",{"type":7,"value":8,"toc":172},"minimark",[9,13,16,19,22,26,29,34,37,40,43,46,57,61,64,67,73,76,79,82,85,88,100,103,106,109,112,115,118,122,125,130,133,136,139,150,154,157,162,165,169],[10,11,12],"p",{},"UE4有提供一套算法帮助类，命名空间为Algo，对于需要快速使用的情况可以参考。",[10,14,15],{},"当前使用的UE4版本为4.18.2。",[10,17,18],{},"整个Algo的定义分散在各个文件中，按照功能区分进行分布。",[10,20,21],{},"在定义上全部都是模板函数，通用性比较强。",[23,24,25],"h2",{"id":25},"数据整理",[10,27,28],{},"这一块是对内存数据块进行整理的通用模板。",[30,31,33],"h3",{"id":32},"copy","Copy",[10,35,36],{},"这是一个系列的拷贝模板函数，主要的工作就是对数据进行拷贝。",[10,38,39],{},"有一个CopyIf的变体，只会把符合条件的数据拷贝到目标中去。",[10,41,42],{},"通常需要拷贝的容器是Arrat，Map之类的，对于这个模板，只要保证源容器实现了range for和目标容器实现了Add函数就可以了。",[10,44,45],{},"当然，数据的类型必须至少是可转换的类型。",[47,48,53],"pre",{"className":49,"code":51,"language":52},[50],"language-text","TArray\u003Cint> TestArray;\nTArray\u003Cint> TestData;\nAlgo::Copy(TestData, TestArray);\n","text",[54,55,51],"code",{"__ignoreMap":56},"",[30,58,60],{"id":59},"transform","Transform",[10,62,63],{},"对数据进行某种操作，并填充到目标。",[10,65,66],{},"也有这Transfor_If的变体，要求传入的Transform操作必须返回要填充到目标的类型。",[47,68,71],{"className":69,"code":70,"language":52},[50],"Algo::Transform(TestData, TestArray, [](int i) { return FMath::DegreesToRadians(i); });\ncheck(TestArray.Num() == NUM_TEST_OBJECTS);\nfor (int i = 0; i \u003C TestArray.Num(); ++i)\n{\n   check(TestArray[i] == FMath::DegreesToRadians(TestData[i]));\n}\n",[54,72,70],{"__ignoreMap":56},[10,74,75],{},"这里由于源与目标的数据类型可以是不一致的，再加上有If变体，其实是一个非常好用的数据批量处理模板。",[10,77,78],{},"这里传入的if条件和转置条件即可以是成员的指针也可以是成员的函数，在使用的时候可以灵活的采用。",[23,80,81],{"id":81},"二分搜索",[10,83,84],{},"内部封装的二分搜索算法，不用每次想要进行搜索的时候临时到Google或者代码库中去翻找搜索算法的代码了。",[10,86,87],{},"提供一下三个基本的函数",[89,90,91,94,97],"blockquote",{},[10,92,93],{},"BinarySearch",[10,95,96],{},"LowerBound",[10,98,99],{},"UpperBound",[10,101,102],{},"功能就如同函数名称一样，是搜索，最小值和最大值的查找。",[23,104,105],{"id":105},"排序",[10,107,108],{},"封装了几个排序算法，不过由于排序算法早就还给课本了，在这里就不比较性能了。",[10,110,111],{},"毕竟一直使用std的sort也没怎么关心过其内部实现，虽然TArray也是有封装sort操作的，这里也就不去看其实现了。",[10,113,114],{},"整体的排序上，有一个Algo::IsSorted()函数可以用于检查数据是否已经经过了排序。",[10,116,117],{},"同时排序算法都有提供SortBy的变体以方便进行更加精致的排序。",[30,119,121],{"id":120},"heap","Heap",[10,123,124],{},"严格的来说也提供了不是排序的部分。这里引用一下Wiki",[89,126,127],{},[10,128,129],{},"a heap is a specialized tree-based data structure",[10,131,132],{},"给和我一样一下子想不起来Heap到底是什么的筒子。",[10,134,135],{},"可以Algo::Heapify(TestArray)来将一个数组转换为Heap，同时提供了IsHeap函数来检查一个数组是否是以Heap的形式保存的。",[10,137,138],{},"然后Algo::HeapSort()才是进行堆排序的，其结果满足Algo::IsHeap以及Algo::IsSorted。",[10,140,141,142,149],{},"另外，根据资料显示，[",[143,144,148],"a",{"href":145,"rel":146},"https:\u002F\u002Fstackoverflow.com\u002Fquestions\u002F19336881\u002Fwhy-isnt-heapsort-stable",[147],"nofollow","HeapSort并不是一个stable的排序算法","]，记得TArray是有提供StableSort的，果然其内部应该是有别的排序实现的。",[30,151,153],{"id":152},"introsort","IntroSort",[10,155,156],{},"这个可以明确的记得当初并没有学过呢，再次引用Wiki",[89,158,159],{},[10,160,161],{},"Introsort or introspective sort is a hybrid sorting algorithm that provides both fast average performance and (asymptotically) optimal worst-case performance.",[10,163,164],{},"似乎是叫内省排序总之是相当优秀的排序算法，只是不是Stable的。",[30,166,168],{"id":167},"sort","Sort",[10,170,171],{},"直接调用Sort就可以了，Unstable，并没有解释到底用的是什么算法。也没有去关注它的实现……",{"title":56,"searchDepth":173,"depth":174,"links":175},2,3,[176,180,181],{"id":25,"depth":173,"text":25,"children":177},[178,179],{"id":32,"depth":174,"text":33},{"id":59,"depth":174,"text":60},{"id":81,"depth":173,"text":81},{"id":105,"depth":173,"text":105,"children":182},[183,184,185],{"id":120,"depth":174,"text":121},{"id":152,"depth":174,"text":153},{"id":167,"depth":174,"text":168},"2017-12-16","md",{"layout":189,"status":190,"published":191,"author":192,"author_login":194,"author_email":195,"wordpress_id":196,"wordpress_url":197,"date_gmt":198,"excerpt":199},"post","publish",true,{"display_name":193,"login":194,"email":195,"url":56},"风铃","flinkor","flinkor@foxmail.com",2158,"\u002F\u002F?p=2158","2017-12-16 08:35:14 +0000",{"type":7,"value":200},[201],[10,202,12],{},"\u002F2017-12-16-ue4-algo-note",{"title":5,"description":12},"_legacy\u002F2017\u002F2017-12-16-ue4-algo-note",[207,208,168],"UE4","Algo","zFRtkSrzpzFpfSpjsqSMzc-9RQQLrc9SyeofTK2pIHw",1788763179449]