Deprecated: Array and string offset access syntax with curly braces is deprecated in /mnt/hep_web/hep_web/member/n-kota/dokuwiki/inc/init.php on line 542
====== 配列 ====== ---- ===== 動的メモリ確保・解放 ===== === 1次元配列 === ////////// 確保 ////////// double *array1; int n1 = 10; array1 = new double[n1]; ////////// 解放 ////////// delete[] array1; ---- === 2次元配列 === == 方法1 == * 一度に確保できるのは1次元までなので、1次元ずつ確保していく。 * 解放も同様に1次元ずつ。 * 配列ポインタへの配列、という扱いで、最初の足ごとに配列の要素数を変えることも可能 ////////// 確保 ////////// double **array2; int n1 = 10; int n2 = 20; array2 = new double*[n1]; for(int i = 0 ; i < n1 ; ++i){ array2[i] = new double[n2]; } ////////// 解放 ////////// for(int i = 0 ; i < n1 ; ++i){ delete[] array2[i]; } delete[] array2; == 方法2 == 後ろの足のサイズが先に決まっている場合、最初の足だけ動的に確保してやるやり方もできる。 ////////// 確保 ////////// double (*array2)[20]; int n1 = 10; array2 = new double[n1][20]; ////////// 解放 ////////// delete[] array2; == 方法3 == std::vectorでやっちゃう int n1 = 10; int n2 = 20; std::vector< std::vector > array2( n1, std::vector(n2) ); ---- === 3次元配列 === 2次元と同様。 ////////// 確保 ////////// double ***array3; int n1 = 10; int n2 = 20; int n3 = 20; array3 = new double**[n1]; for(int i = 0 ; i < n1 ; ++i){ array3[i] = new double*[n2]; for(int j = 0 ; j < n2 ; ++j){ array3[i][j] = new double[n3]; } } ////////// 解放 ////////// for(int i = 0 ; i < n1 ; ++i){ for(int j = 0 ; j < n2 ; ++j){ delete[] array3[i][j]; } delete[] array3[i]; } delete[] array3; ---- ===== std::fill()を使った初期化 ===== * fillの引数は、(first Iterator、last iterator, value) * std::vector とかだとstd::fill(vector.begin(), vector.end(), value);とかstd::fill_n(vector.begin(), vector.size(), value); * 以下のコードではいずれも1で初期化。 #include double array1[10]; std::fill(array, &array[10], 1); std::fill(array, array+10, 1);//これでもOK std::fill_n(array, 10, 1);//これでもOK   double array2[10][20]; std::fill(array2[0],array2[10],1); double array3[10][20][30]; std::fill(array3[0],array3[10],1);