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