这是一篇和OI没什么关系的文章, 在可以预见的有限的OI生涯中是不会用到这玩意的.
最近比较喜欢光污染背景。
Table of Contents
Background
2.28这天一天只做了两道题, 状态不佳, 因为都很不想写.
代码还炒鸡乱.
所以第二题要排序, 就用了Lambda表达式(这什么逻辑?).
Basic Infomation
框架大概长这样:
1 | [capture list] (params list) mutable exception -> return type {function body} |
来自https://www.cnblogs.com/DswCnblog/p/5629165.html
其中捕获列表和函数体是不可省的.
Formats
Capture List
捕获列表是用来捕获所在域内的局部变量的, 对于静态变量和域以外的变量可以自由使用.
至于这和形参的区别也没什么人说我也没搞懂. 有一个特性是值捕获的变量复制发生在这个函数对象创建时, 而不是调用时.
引用捕获要求调用时变量仍然存在, 所以要谨慎使用.
捕获列表大概有这几种:
Type | Meaning |
---|---|
[] | 不捕获 |
[a] | 以值捕获捕获变量a |
[&a] | 以引用捕获捕获a |
[=] | 通过函数体推断捕获变量, 值捕获 |
[&] | 同上, 引用捕获 |
[=,&x] | 其余变量值捕获, x引用捕获 |
[&,=x] | 同上, 相反 |
Parameters List
和函数一样的形参. 不支持默认参数, 可变参数和不指定名称的参数.
Exception
这里主要说一下mutable.
值捕获的变量是不能在函数体内被修改的. 但加上mutable就可以了.
Return Type
可以指定, 也可以自动推断, (大概是不需要decltype?
Function Body
函数体.
Samples
Sort
1 | vector<int> vec; |
Modify
1 | auto modify(vector<int>&vec, int limit) -> decltype(vec) { |
一个Lambda表达式的类型大概是
1 | function<return typename(typename, typename, ...)> |