作者loveme00835 (高髮箍)
看板C_and_CPP
標題Re: [問題] Lambda的higer order function
時間Thu Jul 12 17:17:07 2012
※ 引述《gogoqaz (..)》之銘言:
: 最近在看Lambda
: 有一部份看了很久還是不懂,不知道是他寫太簡捷還是我哪個點沒有抓到
: http://msdn.microsoft.com/en-us/library/dd293599.aspx
: 文件在上面 在higher order function的部份
: auto g = [](int x) -> function<int (int)>
: { return [=](int y) { return x + y; }; };
function<T> 是一個 class template, 它的用途是把函式物件
(function object/functor)包裝起來, 函式物件包含了以下兩類:
1. 重載了 operator() 的類別 instance
2. pointer to function
lambda function 是匿名類別的實體, 該類符合上述 (1), 所以可
以用 function<F> 包裝起來.
對於 g 的解釋, 請看下面例子:
int add(
int x,
int y ) {
return x + y;
}
int f(
int y ) {
return add( 5, y );
}
上面程式碼中, f() 另外幫你傳了一個引數 5 給 add(), 如此一
來假如你有這樣的需求:
"把 vector 內的所有元素都加上 5"
vector<
int> values = { 1, 2, 3 };
transform( values.begin(), values.end(),
values.begin(), f );
就可以套接給 STL Algorithms 使用, 不需要寫多餘的程式碼.
但是問題如果變成:
"把 vector 內的所有元素都加上 n, n=1,2,3...1000"
實作如此巨量的函式已經不是徒手所能辦到, 所以就讓編譯器幫我
們產生需要的 functors. 仔細觀察你可以發現: g 是一個產生器.
像 g(5) 回傳了功能和上述 f() 一樣的函式物件.
transform( values.begin(), values.end(),
values.begin(), g(5) );
功能是一樣的, 好處是不必自己補上實作, 不過做簡單的四則運算
你甚至可以不用自己寫產生器出來:
// C++03
transform( values.begin(), values.end(),
values.begin(), bind1st(plus<int>(), 5) );
// C++11
transform( values.begin(), values.end(),
values.begin(),
bind(plus<
int>(), 5, placeholders::_1) );
: 首先就是上面這邊,不懂為什麼要將int x轉成 function type
: 這樣做的用意到底在哪?
: 接著
: auto h = [](const function<int (int)>& f, int z)
: { return f(z) + 1; };
: 之後 h(g(7),8) output 會是16
: 麻煩大大幫解惑一下 謝謝
h() 接受一個 function object, 為了可用性高它會先用 implicit
cast 轉成 function<F>, 並幫你實現:
"將 z 代入該函式, 並回傳函數值 +1 的結果"
--
≡≡≡≡╔═══╗╔═══╗ ◎ ╔═╗═╗╔═══╗╔═══╗╔╦═╦╗≡≡≡≡
≡金栽經║ ╔╗ ║║ ╔╗ ║╔╗║ ║ ║║ ═ ║║ ╔╗ ║║║ ║║RAINNOUS
≡≡≡≡║ ╚╝ ║║ ╚╝ ║║║║ ║║ ╞╣║ ║║ ║║ ║≡≡≡≡
≡≡≡≡║ ═╣║ ╥ ║║║║ ║ ║║ ═ ║║ ╚╝ ║║ ║ ║≡≡≡≡
≡高佑麗╚═╩═╝╚═╩═╝╚╝╚═╚═╝╚═══╝╚═══╝╚═╩═╝鄭允慧≡
≡≡≡≡≡趙賢榮≡≡≡金智淑≡≡≡RAINBOW≡≡≡盧 乙≡≡≡吳勝雅≡ψmocki
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.121.197.115
推 EdisonX:push :) 07/12 17:34
※ 編輯: loveme00835 來自: 140.121.197.115 (07/12 17:34)
推 gogoqaz:很清楚 感謝你的回答!! 07/12 19:17