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);