この文書の現在のバージョンと選択したバージョンの差分を表示します。
両方とも前のリビジョン 前のリビジョン 次のリビジョン | 前のリビジョン | ||
ja:cpp:array [2017/05/14 06:12] kota [動的メモリ確保・解放] |
ja:cpp:array [2017/05/14 08:35] (現在) kota [std::fill()を使った初期化] |
||
---|---|---|---|
ライン 16: | ライン 16: | ||
</code> | </code> | ||
+ | ---- | ||
=== 2次元配列 === | === 2次元配列 === | ||
- | 一度に確保できるのは1次元までなので、1次元ずつ確保していく。 | + | == 方法1 == |
- | 解放も同様に1次元ずつ。 | + | * 一度に確保できるのは1次元までなので、1次元ずつ確保していく。 |
+ | * 解放も同様に1次元ずつ。 | ||
+ | * 配列ポインタへの配列、という扱いで、最初の足ごとに配列の要素数を変えることも可能 | ||
<code cpp> | <code cpp> | ||
////////// 確保 ////////// | ////////// 確保 ////////// | ||
ライン 38: | ライン 41: | ||
</code> | </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次元配列 === | === 3次元配列 === | ||
ライン 64: | ライン 87: | ||
</code> | </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> |