愚蠢的小把戏

你好。 我是Arjun Bijanki,编译器前端和Intellisense引擎的测试负责人。 几个月前的一个下午,我坐在41号楼的办公室里思考考试通过的问题,突然一对同事之间的热烈讨论涌入了走廊,引起了我的注意。 我记得鲍里斯·贾布斯,你们有些人可能见过他 10是新的6 上周在PDC的一次谈话中,他试图说服另一位同事,你可以写一个自动的 回忆录 C++ 0xlambda的函数。

null

我很好奇。

对于那些以前没有使用C++ 0x lambdas的函数,该函数提供了一种定义未命名函数对象的方法。 VCBlogger STL写了一篇 伟大的职位 这将更详细地描述lambda及其语法。

有趣的是,lambda可以是递归的。 例如,下面的lambda使用递归实现斐波那契级数:

#包括

#包括 <功能>

使用 命名空间 标准;

使用 命名空间 tr1型;

内景 主()

{

//使用tr1::函数实现fib

功能< 内景 ( 内景 )>fib1=[&fib1]( 内景 n) -> 内景

{

如果 (n<=2)

返回 1;

其他的

返回 fib1(n-1)+fib1(n-2);

};

cout<

}

注意我们必须 名称 lambda以实现递归。 如果没有名字,您将如何进行递归调用? 这种自引用对如何使用递归lambda施加了一些限制;lambda不存在;不涉及 它本身 ,指 纤维蛋白B1 ,恰好是它自己。 这种限制很微妙,如下代码所示:

功能< 内景 ( 内景 )>fib1u copy=fib1; //复制fib1

fib1=[]( 内景 n){ 返回 -1; }; //fib1现在做了些别的事情

无法复制(6); //哦,没有达到我们的预期

小测验:你会怎么做 fib1U副本(6) 返回?

不管怎样, 纤维蛋白B1 不是一个特别有效的算法实现,但是,即使我不是函数编程背景,我发现递归解决方案有一定的优雅。 通过将此函数更改为缓存已计算的值,我们可以使其更快:

功能< 内景 ( 内景 )>fib2=[&fib2]( 内景 n) -> 内景

{

静止的 地图< 内景 , 内景 >缓存;

如果 (n<=2)

返回 1;

其他的 如果 (cache.find(n)==cache.end())

{

cache[n]=fib2(n-1)+fib2(n-2);

}

返回 缓存[n];

};

(在这一点上,我应该提出警告,我们真的进入了客厅戏法领域。 函子类对于产生式代码来说是一个更好的选择,它可以在这里做任何事情,等等。)

现在这个函数真的很难读,我也可以迭代地实现它。 这就是自动记忆功能的用武之地。 我们真正想写的是一些漂亮整洁的东西,比如 纤维蛋白B1 ,但允许我们记忆它,以便更快地计算 纤维蛋白B2 :

//记忆fib1函数并找到fib(6)

记忆化(fib1)(6);

我们三个人花了一个小时左右的时间写这封信 记忆化() 功能,但拦截 纤维蛋白B1 的递归插入缓存被证明是困难的。

//突出显示的通话内容是什么?

//我们要使用缓存,而不是直接调用fib。

返回 纤维蛋白B1 (n-1)+ 纤维蛋白B1 (n-2);

如果我们有一个独立管理缓存的函数,我们可以这样进行递归调用:

返回 check_cache(fib1,n-1)+check_cache(fib1,n-2);

这比以前干净多了 纤维蛋白B2 ,但即便如此,我还是不得不故意写 纤维蛋白B1 利用缓存。 如果我不用那样做的话会更好。 最后,我们发现我们需要一种方法来钩住递归并插入我们自己的适配器,在进行递归调用之前检查缓存。 这样,我们就可以写作了 纤维蛋白B1 正常情况下,在盖子下面检查缓存。 tr1::函数 似乎不支持这一点,所以经过几次尝试,我编码了 可调整的u函数 记忆卡适配器 (警告:前面有模板)。

模板 < Arg>

结构 可调整的u函数

{

tr1::函数func;

类型定义 tr1::function,Arg)>适配器类型;

适配器u型适配器;

//绑定函数

自适应函数(tr1::函数 常数 &f):函数(f)

{

}

//通过适配器调用绑定函数(如果存在)

精氨酸 操作人员 ()(Arg p) 常数

{

如果 (适配器)

返回 适配器(func,p);

其他的

返回 func(p);

}

无效 设置适配器(适配器类型 常数 &(一)

{

适配器=a;

}

无效 清除适配器()

{

adapter=适配器类型(); //清除tr1::函数的更好方法?

}

私有的 :

//依赖于自引用递归,因此类是不可复制的

自适应函数 常数 &);

};

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享