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

时间:2012-04-22 00:55:50

标签: 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;
}

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

float g[100][100];
g= cm.arr_sub(T,W);

但在构建类时,它会显示incompatible type assignment of float to float[100][100]

4 个答案:

答案 0 :(得分:11)

我对数组上另一个问题的回答here解释了为什么你不想使用数组。

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

float g[100];
g = foo(); // illegal, assigning to arrays is not allowed

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

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

另请注意,当您声明类似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

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

std::array<std::array<float,100>,100> g;

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

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

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

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

Matrix2d<float,100,100> g;

关于表现的说明

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

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

Matrix g;
arr_sub(T,W,g);

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

答案 1 :(得分:2)

如果您坚持使用“普通C”2D数组,最好的方法是将指针传递给结果以及两个输入参数,而不是按照您的方式按值传递数组。

但是,在C ++中最好的做法是使用vector<vector<float> >代替,并通过引用传递它。

void ClassArray::arr_sub(
    const vector<vector<float> > &a
,   const vector<vector<float> > &b
,   vector<vector<float> > &res)
{
    for(int i=0 ; i != a.size() ; i++)
        for(int j=0 ; j != b.size() ; j++)
            res[i][j] = b[i][j] - a[i][j];
}

void main() {
    vector<vector<float> > a(100, vector<float>(100, 12.345));
    vector<vector<float> > b(100, vector<float>(100, 98.765));
    vector<vector<float> > res(100, vector<float>(100, 0));
    arr_sub(a, b, res);
}

答案 2 :(得分:0)

执行此操作的最佳方法是将所有内容包装到类中。从事物的外观来看,它是一个矩阵。

可能已经有一百个Matrix类了,所以写另一个类是没有意义的。

但是,如果这是一次学习练习,那可能是值得的。

要回答您提出的问题,请为您的函数提出第三个参数:float result[100][100]。在函数内部,将结果写入结果数组。

这是有效的,因为在C和C ++中,数组总是通过引用传递,而不是通过值传递。这是因为C ++只将指针传递给数组的开头。

答案 3 :(得分:0)

如果你真的希望返回一个数组,并且有些人如何设法在main()中使用它,最有效的方法是将返回的数组声明为动态。这样你就可以避免丢失指向这个新数组的指针,因为它将在堆中而不是堆栈中分配。