C++14尝鲜,趣味编程:用lambda实现斐波那契数列

斐波那契数列

#include <iostream>
#include <utility>
using namespace std;

int main()
{
	auto fib = [a = 0, b = 1]() mutable {
		a = exchange(b, a + b);
		return a;
	};
	for(int i = 0; i < 10; ++i)
		cout << fib() << endl;
}
代码说明:
  • 这段代码总共打印10个斐波那契数。
  • fib这个lambda表达式是一个斐波那契数的生成器。每次调用都能产生下一个斐波那契数。
  • [a = 0, b = 1] 这是lambda表达式的捕获列表,通过通用值捕获(即 标识符+初始化器)这一方式 lambda表达式引入 a 和 b 两个变量并分别给它们赋值。通用捕获是C++14所引入的新功能。
  • a = exchange(b, a + b); 这是斐波那契数列的生成器部分。这行代码将 a+b 赋给 b,然后将 b 原有的值赋给 a。
    这行代码大致相当于
    auto temp = b;
    b = a + b;
    a = temp;
  • 要理解这行代码,首先得理解 C++14 新引进的函数 std::exchange()。
    template< class T, class U = T >
     T exchange( T& obj, U&& new_value );
    
    Replaces the value of obj with new_value and returns the old value of obj. 
    std::exchange()函数的功能为:将变量 obj 的值替换为 new_value,然后返回变量 obj 原有的值。
  • mutable指示符必不可少,否则通用值捕获得到的变量 a 和 b 在lambda表达式函数体内将不能被赋值。

std::exchange 与 std::swap

lambda表达式中的值捕获

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值