この文書の現在のバージョンと選択したバージョンの差分を表示します。
| 次のリビジョン | 前のリビジョン | ||
|
ja:cpp:array [2017/05/14 05:56] kota 作成 |
ja:cpp:array [2017/05/14 08:35] (現在) kota [std::fill()を使った初期化] |
||
|---|---|---|---|
| ライン 6: | ライン 6: | ||
| === 1次元配列 === | === 1次元配列 === | ||
| - | double *array; | + | <code cpp> |
| - | int n1 = 10; | + | ////////// 確保 ////////// |
| - | array = new double[n1]; | + | double *array1; |
| + | int n1 = 10; | ||
| + | array1 = new double[n1]; | ||
| + | |||
| + | ////////// 解放 ////////// | ||
| + | delete[] array1; | ||
| + | </code> | ||
| + | |||
| + | ---- | ||
| + | |||
| + | |||
| + | === 2次元配列 === | ||
| + | == 方法1 == | ||
| + | * 一度に確保できるのは1次元までなので、1次元ずつ確保していく。 | ||
| + | * 解放も同様に1次元ずつ。 | ||
| + | * 配列ポインタへの配列、という扱いで、最初の足ごとに配列の要素数を変えることも可能 | ||
| + | <code cpp> | ||
| + | ////////// 確保 ////////// | ||
| + | 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; | ||
| + | </code> | ||
| + | |||
| + | == 方法2 == | ||
| + | 後ろの足のサイズが先に決まっている場合、最初の足だけ動的に確保してやるやり方もできる。 | ||
| + | <code cpp> | ||
| + | ////////// 確保 ////////// | ||
| + | double (*array2)[20]; | ||
| + | int n1 = 10; | ||
| + | array2 = new double[n1][20]; | ||
| + | |||
| + | ////////// 解放 ////////// | ||
| + | delete[] array2; | ||
| + | </code> | ||
| + | |||
| + | == 方法3 == | ||
| + | std::vectorでやっちゃう | ||
| + | <code cpp> | ||
| + | int n1 = 10; | ||
| + | int n2 = 20; | ||
| + | std::vector< std::vector<double> > array2( n1, std::vector<double>(n2) ); | ||
| + | </code> | ||
| + | ---- | ||
| + | |||
| + | === 3次元配列 === | ||
| + | 2次元と同様。 | ||
| + | <code cpp> | ||
| + | ////////// 確保 ////////// | ||
| + | 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; | ||
| + | </code> | ||
| + | |||
| + | ---- | ||
| + | |||
| + | ===== 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で初期化。 | ||
| + | <code cpp> | ||
| + | #include <algorithm> | ||
| + | |||
| + | |||
| + | 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); | ||
| + | |||
| + | </code> | ||