我目前正在学习lambda函数的工作方式,因此尝试将数组传递给Lambda函数,并在其中打印出来。我的问题是,我不了解如何将数组传递到函数中。问题似乎根源在于将数组传递给lambda函数时的转换。这是函数的当前状态:
auto print_array = [](int &array, int i) -> int {
//print out array
return 0;
}(&actual_array, actual_i);
非常感谢您的帮助!
答案 0 :(得分:1)
您不能按值传递数组,并且传递指针的语法也有误。
尽管实际上将指针或引用传递给数组很容易。使用通用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
实例正在接受int(&)[5]
,该实例隐藏在auto&
后面。
如果由于某种原因您不能遵守通用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的。任何功能都一样。
答案 1 :(得分:0)
数组不能是函数参数。
此外,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]);
多态lambda(在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]
。
P.S。 “打印出”阵列听起来像不需要修改阵列的事情。考虑这一点,如果可能,请使用指向第一个元素的const
指针或const
引用作为参数。
请注意,std::array
包装器是一个类,而不是数组。这样,std::wrapper
不会隐式衰减到指针,并且如果需要,可以将std::array
用作函数参数。
答案 2 :(得分:0)
声明一个以数组(和长度)为参数的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);