C++ lambda 递归调用
自己敲的一个归并排序,C++11
#include
#include
using namespace std;
template
void merge_sort(T lst[], int length) {
/*
* 功能:对序列 lst 进行归并排序,自顶向下,递归操作
* 参数:lst:序列指针;length:序列长度
* 返回值:无
*/
// 申请临时空间
T *tmp = new T[length];
auto merge = [&lst, &tmp](auto &&self, int first, int first_tail, int second, int second_tail) -> void {
// 存在任一子串的长度大于 2 ,则将其拆分成两个子串归并
int mid = 0;
if (first_tail - first > 1) {
mid = (first_tail + first) / 2;
self(self, first, mid, mid, first_tail);
}
if (second_tail - second > 1) {
mid = (second_tail + second) / 2;
self(self, second, mid, mid, second_tail);
}
// 临时空间的索引
int i = 0;
// 归并操作,两个序列均未取完,则先取小的
while (first < first_tail && second < second_tail) {
tmp[i++] = lst[first] < lst[second] ? lst[first++] : lst[second++];
}
// 存在一个序列已经取完,则将另一序列剩下的元素取尽
while (first < first_tail) tmp[i++] = lst[first++];
while (second < second_tail) tmp[i++] = lst[second++];
// 回填
while (i--) lst[--second_tail] = tmp[i];
};
// 调用
merge(merge, 0, length, length, length);
// 删除申请的空间
delete[] tmp;
}
int main() {
int length = 100;
int *lst = new int[length];
for (int i = 0; i < length; i++) {
lst[i] = rand() % length + 1;
}
merge_sort(lst, length);
for (int i = 0; i < length; i++) {
cout << lst[i] << " ";
}
return 0;
}
其中关于 merge 函数的递归调用我是通过传递函数指针来实现的,想问下各位大牛有没有什么更优雅一点的写法,比如说直接通过 capture 将函数指针捕获到。
相关阅读:
webpack热加载正常 页面刷新报错
vuejs 中的.native原生事件是什么意思?如何使用?
如何用$elemMatch返回数组中多条数据
vscode的目录树怎么选中多文件
实现CPU与外部设备并行工作的硬件设备是?
文本中没有添加换行属性;出现强制换行是什么原因
js代码和html写在一起的,怎么用babel编译js代码?
利用extract-text插件打包css出错
关于在闭包中使用AJAX保存数据时,不执行success回调,直接return的问题。
::selection 选择器使用遇到的问题
把ID名作为参数传到函数里,使用不了?
webstorm live templates jar 怎么生成
ie9下诡异的问题
如何在一张大图中确认一个位置作为按钮,同时在不同手机屏幕上都能正常显示呢?
mui框架app怎么连接蓝牙打印机并打印?求代码?
Wordpress从http转到https,其他页面都是好的,就category页面还是请求的http下的js和css资源
docker 下面创建的IMAGE 他们的 ID 一样?这个是怎么回事????
阳历转农历的算法是什么啊, 怎么算啊
vue怎么给div绑定blur事件
mysql语句,事务处理回滚的问题。