c++11:lambda表达式的使用
C++ 11 表达式 lambda 使用
2023-09-14 08:57:14 时间
lambda表达式的一般形式:
[capture list] (parameter list) -> return type{function body};
其中,capture list (捕获列表)是一个lambda所在函数中定义的局部变量的列表(通常为空);
return type、parameter list和function body与任何普通函数一样分别表示返回类型、参数列表和函数体。
但是与普通函数不同,lambda必须使用尾置返回来指定返回类型。
此外,我可以忽略参数列表和返回类型,但必须永远包含捕获列表和函数体:
auto f = [] { return 42 }
此例中,我们定义了一个可调用的对象f, 它没有参数,返回值为42;
调用方式:与普通函数一致;
cout << f() << endl;
在忽略了返回值类型的情况下, lambda根据函数体中代码推断出返回值类型;如果函数体只是一个return语句,则返回类型从返回的表达式的类型推断而来。否则,返回类型为void。
使用条件:
“引用捕获有时是必要的。例如, 我们可能希望biggies函数接受一个ostream的引用,用来输出数据,并接受一个字符作为分隔符:”
void biggies(vector<string> &words, vector<string> ::size_type sz, ostream &os = cout, char c = ' ') { //打印count的语句改为打印到os for_each(words.begin(), words.end(), [&os, c] (const string &s) { os << s << c; }); }
我们不能拷贝ostream对象,因此捕获os的唯一方法就是捕获其引用(或指向os的指针)。
注意:当引用方式捕获一个变量时,必须保证lambda执行时变量是存在的。
一般来说,我们应该尽量减少捕获的数据量,来避免潜在的捕获导致的问题。而且,如果可能的话,应该避免捕获指针或引用。
相关文章
- C++多态纯虚函数和抽象类与多态案例(二)-制作饮品
- EasyC++15,C++指针初探
- Dijkstra(迪杰斯特拉算法)的实现-------------------------C,C++,Matlab实现
- C++精通之路:设计模式(特殊类设计)
- 每个C++工程师都要了解的十个性能陷阱
- c++将十进制数转化为二进制数_十六进制小数转二进制
- C/C++ Qt MdiArea 多窗体组件应用
- c++的链表-链表入门(C++)
- c++的链表-C++实现简单链表
- 面试高频问题之C++11新特性
- 【C++修炼之路】26.C++11(语法糖)
- c++基础篇之C++ 模板
- C++11(右值引用)
- C++11类型转换
- C++11可变参数模板
- C++11 shared_ptr(智能指针)详解
- C++ adjacent_difference相邻差计算方法详解
- C++ STL标准模板库
- C++ STL map删除键值对:erase()和clear()方法
- C++ STL move_iterator移动迭代器用法详解
- C++11完美转发及实现方法详解
- C++中指向结构体变量的指针
- c++实现MD5算法实现代码
- C++实现的一个可以写递归lambda的Y函数