如何将数组传递给 lambda 表达式?

问题描述 投票:0回答:3

我正在尝试将数组传递给 lambda 表达式,我想将其打印出来。我不明白如何将数组传递到函数中。问题似乎根源于数组传递给 lambda 函数时的转换。这是该函数的当前状态:

int actual_array[5] = {7,8,9,2,1};
const int actual_i = 3;

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

    //print out array

    return 0;

}(&actual_array, actual_i);
c++ arrays lambda
3个回答
4
投票

您不能按值传递数组,并且传递指针的语法都是错误的。

传递指针或引用到数组实际上很容易。使用泛型 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
投票

声明一个以数组(和长度)作为参数的 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);

1
投票

数组不能作为函数参数。

此外,

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]


附注“打印出”数组听起来像是不需要修改数组的东西。考虑这一点,如果可能的话,使用指向第一个元素的

const
指针或
const
引用作为参数。

请注意,

std::array
包装器是一个类,而不是一个数组。因此,
std::wrapper
不会隐式衰减为指针,并且如果需要,
std::array
可以用作函数参数。

© www.soinside.com 2019 - 2024. All rights reserved.