この文書の現在のバージョンと選択したバージョンの差分を表示します。
次のリビジョン | 前のリビジョン | ||
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> |