【问题标题】:Declaring lambda with int type not working [closed]用 int 类型声明 lambda 不起作用[关闭]
【发布时间】:2021-11-24 07:24:51
【问题描述】:

我想以某种方式使用 lambda 函数,但它不起作用,我不知道为什么。

vector<int> v;

/* ... */

int median = [](vector<int> a)
{
    sort(a.begin(), a.end());
    return a[a.size() / 2];
} 

我创建了一个 lambda 函数,但我该如何调用它? int median = [](vector&lt;int&gt; a) { ... } (v)?但它也不起作用。

我只在一些示例中看到过 lambda 函数,例如制作自定义比较器。我可以让它在我的情况下工作吗?

【问题讨论】:

  • lambda函数不是int类型...可以使用auto median = 或者在}(v);的地方调用
  • 为什么不是int类型?我正在返回一个数组元素,所以它应该是int?
  • 您正在返回 lambda 函数,因为它没有就地调用。
  • @RussianStranger lambda 是一个可调用对象。 int 完全不同。

标签: c++ function c++11 lambda function-call


【解决方案1】:

我可以让它在我的情况下工作吗?

是的,你可以。你可以叫它immediately after the definition:

int median = [](std::vector<int> a) {
    std::sort(a.begin(), a.end());
    return a[a.size() / 2];   
}(v); 
//^^  --> invoke immediately with argument


参考:How to immediately invoke a C++ lambda?

或定义 lambda 并稍后调用它。

/* const */ auto median = [](std::vector<int> a) { ...}
int res = median(v);

请注意,我使用了auto 类型来指定 lambda 函数的类型。这是因为,lambda 具有所谓的闭包类型,我们只能通过auto 或任何类型擦除机制(例如std::function)来提及。 p>

来自cppreference.com

lambda 表达式是 唯一的未命名非联合非聚合类类型的纯右值表达式,称为闭包类型,它在最小块范围内声明(为了 ADL 的目的),包含 lambda 表达式的类范围或命名空间范围。

【讨论】:

  • 另一种情况可能是“无捕获 lambdas”也可以存储在类型化函数指针中。我希望这个问题太深入了(IMO)。
【解决方案2】:

'median' 是一个函数,但你可以像这样声明返回类型。

#include<functional>
vector<int> v;

/* ... */

std::function<int(vector<int>)> median = [](vector<int> a)->int
{
    sort(a.begin(), a.end());
    return a[a.size() / 2];
}; 

【讨论】:

  • auto 是声明 lambda 的更好方法。
  • 同意。我的只是为了清楚起见。
猜你喜欢
  • 2018-09-03
  • 2021-04-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-13
  • 2015-09-30
相关资源
最近更新 更多