【C++】lambda 表达式
1.lambda 表達(dá)式
1.1 lambda 特點(diǎn)
-
lambda表示一個(gè)可調(diào)用單元,可視為內(nèi)聯(lián)函數(shù)
-
范式 : 具有一個(gè)返回類型,一個(gè)參數(shù)列表,一個(gè)函數(shù)體
[captrue list](parameters list)->return type {function body}
captrue list 捕獲列表是一個(gè)lambda所在函數(shù)中定義局部變量的列表(通常為空),但與普通函數(shù)不同,lambda必須有尾置返回類指定返回類型。
-
可以忽略參數(shù)列表和返回類型
-
auto f = [] {return 42; }; std::cout << f() << std::endl;
-
實(shí)參必須與形參匹配(lambda沒有默認(rèn)參數(shù),數(shù)量相等,一旦初始化完畢,就可以執(zhí)行函數(shù)體)
bool isShorter(const string& s1, const string& s2) {return s1.size() < s2.size(); }使用lambda實(shí)現(xiàn)如下
[](const string& s1, const string& s2) {return s1.size() < s2.size();}注:空捕獲表明該lambda沒有使用任何局部變量
1.2 基于lambda不同捕獲方式(實(shí)現(xiàn)的stable-sort)
bool isShorter(const string& s1, const string& s2) {return s1.size() < s2.size();
}int main(char argc, int* argv[]) {vector<string> wordVec = { "the","quick","red","fox","jnmp","slow","over","the","red" };std::stable_sort(wordVec.begin(), wordVec.end(), isShorter);//the red fox the red jnmp slow over quickstable_sort(wordVec.begin(), wordVec.end(),[](const string& a, const string& b){return a.size() < b.size(); });
}
-
lambda必須使用明確指明的變量,使用的局部變量必須通過捕獲列表指出lambda在其內(nèi)部包含訪問的局部比那輛所需要的的信息。
例如:
-
1 sz值正常捕獲
[sz](const string &a){return a.size() >= sz}; -
2 錯(cuò)誤 sz值未捕獲
[](const string &a){return a.size() >= sz}; -
當(dāng)向一個(gè)函數(shù)傳遞lambda時(shí)候,同時(shí)定義一個(gè)新的類型和該類型的對(duì)象。
-
lambda生成的類都包含一個(gè)對(duì)應(yīng)該lambda所捕獲的變量的成員,該成員在對(duì)象創(chuàng)建時(shí)倍初始化。
- 值傳遞
void func1(){size_t v1=42;auto f=[v]{return v1;};v1=0;auto j=f();//j為42,f保存v1的拷貝 }-
引用捕獲
void func2(){size_t v1=42;auto f2=[&v]{return v1;}; //差異 &多了一個(gè)引用符號(hào)v1=0;auto j=f2();//j為42,f保存v1的拷貝 }
-
2. lambda表達(dá)式的值捕獲和引用捕獲
2.1 for_each獲取指定的長度排序后的字符串長度,lambda表達(dá)式
string make_plural(size_t ctr, const string& word, const string& ending)
{return (ctr == 1) ? word : word + ending;//make_plural(wc, "word ", "s ")當(dāng)輸入中文本中//word數(shù)大于一是在word后加s,為words為word的復(fù)數(shù)!
}int main(char argc, int* argv[]) {vector<string> wordVec = { "the","quick","red","fox","jnmp","slow","over","the","red" };//the red fox the red jnmp slow over quickstable_sort(wordVec.begin(), wordVec.end(),[](const string& a, const string& b){return a.size() < b.size(); });vector<string>::size_type sz = 4;auto wc = find_if(wordVec.begin(), wordVec.end(),[sz](const string& a){return a.size() >= sz; });auto count = wordVec.end() - wc;cout << count << " " << make_plural(count, "word", "s") << " of length" << sz << " or longer" << endl;for_each(wc, wordVec.end(), [](const string& s) { cout << s << " "; });return 0;
}
輸出結(jié)果:
4 words of length4 or longer
jnmp slow over quick //for_each后對(duì)應(yīng)的值
-
版本二
ostream& os = cout;char c = ' ';for_each(wordVec.begin(), wordVec.end(),for_each(wc, wordVec.end(),[&os, c](const string& s){ os << s << c; });-
輸出
the red fox the red jnmp slow over quick------------ jnmp slow over quick
-
-
版本三 隱式捕獲
-
& = ,&告訴編譯器采用捕獲應(yīng)用的方式,=表示采用值捕獲的方式
//sz 為隱式捕獲,值捕獲方式 auto wc = find_if(wordVec.begin(), wordVec.end(),[=](const string& a){return a.size() >= sz; }); -
版本四 一部分變量采用值捕獲,其他變量采用引用捕獲,可以混合使用引用捕獲和顯示捕獲
//os 隱式捕獲,引用捕獲方式;c為顯示捕獲,值捕獲方式 for_each(wc, wordVec.end(),[&, c](const string& s){ os << s << c; }); //os 為顯示捕獲,引用捕獲方式;c隱式捕獲,值捕獲方式 for_each(wc, wordVec.end(),[=, &os](const string& s){ os << s << c; });
總結(jié)
以上是生活随笔為你收集整理的【C++】lambda 表达式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 爱情累不累是什么歌啊?
- 下一篇: 【C++】bind参数绑定 P354(通