動的数の行と固定数の列の2Dアレイの初期化。 C ++
-
27-09-2019 - |
質問
C ++で2Dダイナミックアレイの作成に問題があります。 「列」の動的数(例:numr)が「列」の数を固定していることを望んでいます。
私はこのようにやってみました:
const numC = 2;
int numR;
numR = 10;
double *myArray[numC];
myArray = new double[numR];
残念ながら、うまくいきません。そのような方法でそれを行うことは可能ですか?
もちろん使用できます double **myArray
両方の寸法が動的であるかのように初期化します(numcがループでリミッターとして使用されています)が、可能であれば避けたいと思います。
前もって感謝します。
解決
そのような方法でそれを行うことは可能ですか?
はい:
double (*myArray)[numC] = new double[numR][numC];
// ...
delete[] myArray;
これは少し珍しいかもしれませんが、5.3.4§5は明確に述べています。
タイプの
new int[i][10]
はint (*)[10]
多くのプログラマーはC宣言者の構文に精通しておらず、このコードを理解していないことに注意してください。また、手動の動的割り当ては例外ではありません。これらのレーオンの場合、配列のベクトルの方が優れています。
#include <vector>
#include <array>
std::vector<std::array<double, numC> > vec(numR);
// ...
// no manual cleanup necessary
交換 std::array
と std::tr1::array
また boost::array
, 、コンパイラに応じて。
他のヒント
使用してみませんか std :: vector, 、そしてそれを利用してください コンストラクタ:
std::vector<std::vector<int> > my2Darray(2, std::vector<int>(10));
my2Darray[0][0] = 2;
配列を作成する必要があるため、ループが必要です すべての列に対して.
あなたが望んでいるのは:
double *myArray[numC];
for (int i = 0; i < numC; i++) {
myArray[i] = new double[numR];
}
// some code...
// Cleanup:
for (int i = 0; i < numC; i++) {
delete [] myArray[i];
}
これは、一連のポインターを宣言します(へ double
) と numC
要素、次にの配列が作成されます double
sと numR
各列の要素 myArray
. 。メモリが完了したら、メモリをリリースすることを忘れないでください。または、メモリリークがあります。
インデックスは行、次に列にする必要があります。
double** myArray = new double*[numR];
for( unsigned int i = 0; i < numR; i++ ) {
myArray[i] = new double[numC];
}
アクセス行2、列5:
myArray[2][5];