我对另一个关于数组的问题的回答解释了为什么你不想使用数组。
正如我在那个答案中所说,你不能像你尝试的那样分配一个数组:
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 它:
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 可以利用移动语义来避免复制其所有元素。