for ループや while ループを使用せずに 2D 配列を動的に割り当てることはできますか? c c ++に直接コマンドまたは関数がありますか?
6 に答える
ループを使用しないと、ISO c++ に 1 つの制限があります。つまり、コンパイル時に 1 つの次元のサイズを決定する必要があります。次に、この割り当ては、次のように 1 つのステートメントで実行できます。
#define COLUMN_SIZE 10 // this has to be determined at compile time
int main()
{
int (* arr)[COLUMN_SIZE];
int rows = 20; // this is dynamic and can be input from user at run time
arr = new int[rows][COLUMN_SIZE];
arr[3][4] = 10;
cout << arr[3][4] << endl;
return 0;
}
newで割り当てられたメモリは解放する必要があります。また、それを n 次元に拡張すると、これらの次元のうちの1 つだけが実行時に決定されます。その理由は、連続したメモリの行を作成するために、コンパイラが各行のサイズを知る必要があるためです。
生のポインターは避けるべきですが、これはうまくいくはずです->
int *myArray = new int[R*C];
ここで、R は行数、C は列数です。実際には 1D 配列ですが、2D 配列として操作できます。たとえば、次のmyArray[i][j]
ように読むことができます->
myArray[i*C + j]
arr[..][..] 形式でアクセスする別の方法。
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
int main()
{
int COL ;
int ROW ;
COL = 8;
ROW = 12;
int (*p)[COL];
int *mem = (int*)malloc(sizeof(int)*COL*ROW);
memset(mem,0,sizeof(int)*COL*ROW);
p = (int (*)[10])mem;
printf("0x%p\n", p);
printf("0x%p %d\n", p+1, (((int)(p+1))-((int)p))/sizeof(int));
mem[2*COL+0] = 1;
printf("%d\n", p[2][0]);
mem[2*COL+5] = 2;
printf("%d\n", p[2][5]);
mem[6*COL+7] = 3;
printf("%d\n", p[6][7]);
p[1][2] = 4;
printf("%d\n", mem[1*COL+2]);
free(p);
return 0;
}
もちろん、int (*p)[COL] = (int (*)[COL]) malloc(sizeof(int)*COL*ROW);
直接行うこともできます。
out ループを使用しないでこれを行う唯一の方法は、擬似 2D 配列を次のように割り当てることです。
int *ary = new int[sizeX * sizeY];
しかし、それにアクセスすることは非標準であり、率直に言って醜いです:
ary[y*sizeX + x]
「実際の」2D配列が必要な場合は、ループの初期化で立ち往生しています:
int **ary = new int*[sizeY];
for(int i = 0; i < sizeY; ++i) {
ary[i] = new int[sizeX];
}
ただし、クリーンアップには注意する必要があります。
for(int i = 0; i < sizeY; ++i) {
delete [] ary[i];
}
delete [] ary;
だから私の見解では
std::vector<std::vector < int> >
おそらく、実際のアプリで使用する最も簡単で安全な方法です。
ループを再帰で置き換えてみてください
Astd::map<TypeDim1, std::map<TypeDim2, TypeContent> >
は、2D 配列を表すために動的に割り当てられる選択肢である場合があります。
#include <map>
typedef std::map<int, std::map<int, std::string> > array2dstring;
int main(int argc, char *argv[])
{
array2dstring l_myarray2d;
l_myarray2d[10][20] = "Anything";
}