这是一篇和OI没什么关系的文章, 在可以预见的有限的OI生涯中是不会用到这玩意的.

最近比较喜欢光污染背景

Table of Contents

  1. Background
  2. Basic Infomation
  3. Formats
    1. Capture List
    2. Parameters List
    3. Exception
    4. Return Type
    5. Function Body
  4. Samples
    1. Sort
    2. Modify

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
2
3
vector<int> vec;
for (int i = 1; i <= 10; ++i) vec.push_back(rand());
sort(vec.begin(), vec.end(), [](int a, int b) -> bool {return a < b});

Modify

1
2
3
4
5
auto modify(vector<int>&vec, int limit) -> decltype(vec) {
auto func = [limit](int i) -> int {return i >= limit ? -1 : i;};
transform(vec.begin(), vec.end(), vec.begin(), func);
return vec;
}

一个Lambda表达式的类型大概是

1
function<return typename(typename, typename, ...)>