将数组传递给lambda函数

时间:2018-09-11 15:56:47

标签: c++ lambda

我目前正在学习lambda函数的工作方式,因此尝试将数组传递给Lambda函数,并在其中打印出来。我的问题是,我不了解如何将数组传递到函数中。问题似乎根源在于将数组传递给lambda函数时的转换。这是函数的当前状态:

auto print_array = [](int &array, int i) -> int {

    //print out array

    return 0;

}(&actual_array, actual_i);

非常感谢您的帮助!

3 个答案:

答案 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);