1. 程式人生 > >C++14嚐鮮,趣味程式設計:用lambda實現斐波那契數列

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表示式中的值捕獲