如何在c ++中返回一个数组

use*_*915 0 c++

我该如何从函数返回一个数组?我的代码是

float ClassArray::arr_sub(float a[100][100], float b[100][100]) {
    int i,j;
    for(i = 1; i < 10; i++) {
        for(j = 1; j < 10; j++){
            f[i][j]=b[i][j]-a[i][j];
        }
    }
    return f;
}
Run Code Online (Sandbox Code Playgroud)

并且应该将从此函数返回的f分配给在其他类中声明的另一个数组g.

float g[100][100];
g= cm.arr_sub(T,W);
Run Code Online (Sandbox Code Playgroud)

但是在建造课程时,它说incompatible type assignment of float to float[100][100].

bam*_*s53 11

在这里回答关于数组的另一个问题,解释了为什么你不想使用数组.

正如我在那个答案中所说,你不能分配像你正在尝试的数组:

float g[100];
g = foo(); // illegal, assigning to arrays is not allowed
Run Code Online (Sandbox Code Playgroud)

对数组的另一个奇怪的限制是你不允许从函数返回它们:

float foo()[100]; // illegal, returning an array from a function is not allowed
Run Code Online (Sandbox Code Playgroud)

还要注意,当你声明一个函数时,float arr_sub(float a[100][100])你可能会认为你是按值传递一个数组,但事实上它会调用另一个奇怪的数组异常.在C和C++中,每当您将函数的形式参数声明为数组时,类型将从"数组"调整为"指向数组元素类型的指针".


因为数组的行为不像它们应该的那样,所以你应该使用std :: array或std :: vector:

std::array<float,100> foo(); // works

std::array<float,100> g;
g = foo(); // works
Run Code Online (Sandbox Code Playgroud)

要做多维数组,您可以使用:

std::array<std::array<float,100>,100> g;
Run Code Online (Sandbox Code Playgroud)

虽然这有点麻烦,所以你可以输入它:

typedef std::array<std::array<float,100>,100> Matrix;

Matrix ClassArray::arr_sub(Matrix a, Matrix b) {
    ...
}

Matrix g;
g = cm.arr_sub(T,W);
Run Code Online (Sandbox Code Playgroud)

如果你有一个支持C++ 11的编译器,你甚至可以做一个模板类型别名:

template<typename T,int Rows,int Columns>
using Matrix2d = std::array<std::array<T,Columns>,Rows>;

Matrix2d<float,100,100> g;
Run Code Online (Sandbox Code Playgroud)

关于性能的说明

您可能不希望按值返回std :: array有一个原因.如果数组很大,那么将数据从返回值复制到您为其分配的变量中可能会有显着的性能成本.如果这对你来说是一个问题,那么std :: array的解决方案与其他大型的解决方案相同; 使用'out'参数而不是按值返回.

void arr_sub(Matrix a, Matrix b, Matrix &result);

Matrix g;
arr_sub(T,W,g);
Run Code Online (Sandbox Code Playgroud)

这不适用于std :: vector,因为std :: vector可以利用移动语义来避免复制其所有元素.