将数组传递到 lambda 函数中
Passing an array into a lambda function
我目前正在学习lambda函数的工作原理,因此试图将数组传递给Lambda函数,我想在那里打印出来。我的问题是,我不明白如何将数组传递到函数中。问题的根源似乎在于数组在传递给 lambda 函数时的转换。这是函数的当前状态:
auto print_array = [](int &array, int i) -> int {
//print out array
return 0;
}(&actual_array, actual_i);
非常感谢帮助!
你不能按值传递数组,而且传递指针的语法都是错误的。
不过,将指针或引用传递给数组实际上很容易。使用泛型 lambda,您可以忽略维度是类型的一部分这一事实,只需编写:
#include <iostream>
int main()
{
int actual_array[5] = {7,8,9,2,1};
const int actual_i = 3;
auto print_array = [](auto& ar, int i) {
std::cout << ar[i] << 'n';
};
print_array(actual_array, actual_i);
}
在此示例中,您调用的print_array
实例化是接受隐藏在auto&
后面的int(&)[5]
。
如果您由于某种原因无法遵守通用 lambda(基本上是一个模板(,那么请老派:
#include <iostream>
int main()
{
int actual_array[5] = {7,8,9,2,1};
const int actual_i = 3;
auto print_array = [](const int* ar, int i) {
std::cout << ar[i] << 'n';
};
print_array(&actual_array[0], actual_i);
}
这些都不是特定于 lambda 的。对于任何函数都是一样的。
声明一个以数组(和长度(作为参数的 lambda 变量;
using namespace std;
auto print_array = [](const int *items, int length) {
for (int i = 0; i < length; i++)
{
cout << items[i] << endl;
}
};
要调用:
int myArray[] = { 11,22,33,44 };
print_array(myArray, 4);
数组不能是函数参数。
此外,int
引用不能绑定到int
数组。整数引用也不能用作数组。
但是,可以使用下标运算符访问指针,其方式与数组大致相同。数组的名称实际上隐式转换为指向第一个元素的指针。这种转换称为衰减:
int array[n];
int* ptr_to_first_element = array;
assert(ptr_to_first_element[i] == array[i]);
因此,您可以使用整数指针作为函数参数,并将指针传递给数组的第一个元素:
void foo(int *array, std::size_t size);
// ...
int array[n];
foo(array, n);
以上所有内容也适用于 lambda。所以你可以写:
auto print_array = [](int *array, int i) -> int {
// ^ notice this
//print out array using the pointer
return 0;
}(&actual_array, actual_i);
但是,您可以将对确定大小的数组的引用作为函数的参数:
void foo(int (&array)[20]);
这是一个位限制,因为引用只能绑定到一个特定大小的数组。模板使为任何大小的数组生成此类函数变得简单:
template<std::size_t size>
void foo(int (&array)[size]);
多态λ(在C++14中引入(大大简化了这一点:
int actual_array[10];
auto print_array = [](auto &array, int i) -> int {
// ^^^^^^ notice this
//print out the referred array
return 0;
}(&actual_array, actual_i);
在这种情况下,array
参数的类型将被推导出为int (&)[10]
。
附言"打印"数组听起来像是不需要修改数组的东西。请考虑这一点,如果可能,请使用指向第一个元素或const
引用的const
指针作为参数。
请注意,std::array
包装器是一个类,而不是数组。因此,std::wrapper
不会隐式衰减到指针,如果需要,std::array
可以用作函数参数。
- C++Boost Asio Pool线程,带有lambda函数和传递引用变量
- 如何建立使用模板函数的lambda函数的尾部返回类型
- 我可以将调用类的"this"传递给 lambda 函数吗?
- 两组使用lambda函数的大括号
- 尝试将lambda函数放在队列中时出现一般分配器错误(可能是与unique_ptr有关的错误)
- 我可以在这里替换什么,因为我不能在 C# 中使用隐式变量的 lambda 函数?
- 为什么我不能在 constexpr lambda 函数中使用 std::tuple
- C++:Lambda 函数指针转换的用例是什么?
- 将 lambda 函数作为参数传递C++
- 如何将 lambda 函数作为参数发送到另一个函数
- 传递 lambda 函数的权衡是什么?
- 如何使用类模拟 C++11 中的 lambda 函数和闭包?
- 不是 lambda 函数中的常量表达式
- 如何使用可变参数数重载 lambda 函数?
- 如何通过指针传递lambda函数?
- 使用带有 lambda 函数指针的模板
- openmp c++ 中并行块内 lambda 函数的奇怪行为
- C++ 中 Lambda 函数中的溢出
- 将数组传递到 lambda 函数中
- lambda 函数未显示正确的结果