配列に関する別の質問に対する私の答えは、配列を使用したくない理由を説明しています 。
その答えで私が言っているように、あなたが試みているように配列を割り当てることはできません:
float g[100];
g = foo(); // illegal, assigning to arrays is not allowed
配列に関するもう1つの奇妙な制限は、関数から配列を返すことが許可されていないことです。
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を値で返したくない理由が1つあります。配列が大きい場合は、データを戻り値から割り当てた変数にコピーする際に、パフォーマンスが大幅に低下する可能性があります。それが問題になる場合は、std::arrayを使用したソリューションは他の大きなタイプの場合と同じです。値で返す代わりに、「out」パラメーターを使用します。
void arr_sub(Matrix a, Matrix b, Matrix &result);
Matrix g;
arr_sub(T,W,g);
std :: vectorは移動セマンティクスを利用して、すべての要素をコピーする必要がないため、これはstd::vectorには適用されません。