行列やその他の多次元配列がCやC++で表現される方法や、それらを動的に割り当てる方法についてはまだ分かりません。私が正しく理解していれば、これはスタック上の整数のN×N行列を割り当て行列とC++での配列の配列とそれらの動的割り当て
int main()
{
int n;
cin >> n;
int a[n][n];
...
}
:
は、次のコードセグメントを考えてみましょう。 行列の(i、j)番目の要素には、[i] [j]を使用してアクセスできます。コンパイラ は、これを実際に割り当てられた1次元配列の(n * i + j)番目の要素へのアクセスに自動的に変換します。
スタックの の代わりに、n×nの行列aをヒープに割り当てたいとします。私は、次の操作を行うことができます
int main()
{
int n;
cin >> n;
int** a;
a = new int*[n];
for (int i=0;i<n;i++) a[i] = new int[n];
...
}
私は今、[I] [J]として再び(i、j)は番目の要素にアクセスすることができます。しかし、実際にはn * n int、 にintにn個のポインタを加えてスペースを割り当てなければならなかったので、これは正確に と同じではありません。また、[i] [j]にアクセスすると、今度はメモリへのアクセスが2回しか発生せず、ただ1つの になります。一方、インデックス計算n * i + jは回避される。
ここで、mが小さい、例えばm = 2のm×nの行列に興味があるとします。 行ポインタの配列を使用すると、領域の33%が無駄になります。それを回避する方法はありますか? ?
もちろん、1次元配列を割り当ててインデックス演算を自分で行うことはできますが、 これは私にとって最高の解決策ではありません。
ご了承ください。自分で行くには良い方法です
インデックス数学をやってint main()
{
int n;
cin >> n;
int *a;
a = new int[n*n];
}
:
は、私はそれをテストし、あなたの最初のコードは( '[N]の宣言で[N]') –
を動作するはずわからないんだけど、それは作業を行います。私はまた、このようなn×nの行列を2つ割り当てようとしました。アドレスの違いは4(n * n + 1)です。これは、n * n intが実際に割り当てられていることを示しているようです。私はなぜ1が存在するのか分かりません。 – user1290928
これは気にする必要はありません(コンパイラは、ローカルデータのアラインメントを強制するかもしれません)。 –