2018년 3월 16일 금요일

C++ 配列 初期化 std::fill, std::fill_n ..整理

BAEKJOON ONLINE JUDGEを始めたのはC++に慣れるためでした。
今はある程度慣れたんですが意味も分からず、もしくは間違って知って習慣的に使ってるのがありました。配列の初期化もそうでした。
何回も調べた内容なので今回ちゃんと整理してみました。

配列初期化

1次元配列のすべて要素の値を0にしたい場合

1)int arr[5]={};
2)int arr[5]={0};
3)int arr[5]={0,};
一部だけ指定した場合、残りは全部0で初期化されました。
int arr[5]={1,} => 1,0,0,0,0
のこケースでよく間違いました。

1次元配列のすべで要素の値を1にしたい場合

1)各要素の値を直接指定
int arr[5]={1,1,1,1,1}
これは。。。要素の数が少ないケースに当たります。

2)std::fill_n利用
int arr[5];
fill_n(arr,5,1);
宣言と当時の初期化ではありませんが
int arr[5];fill_n(arr,5,1);
ように1列でも良いかと思いました。

fill_n(変更する要素範囲の開始アドレス、変更する要素個数、変更値)
配列全体を変更:配列名=配列のアドレス(arr) => fill_n(arr,5,1);
配列の2番目要素から変更:arr+1                    => fill_n(arr+1,4,1);

3)std::fill利用
int arr[5];
fill(arr,arr+5,1);

fill_n(変更する要素範囲の開始アドレス、変更する要素範囲の終了アドレス、変更値)
変更する要素範囲の終了アドレスが少し曖昧でした。
配列の2番目の要素から4番目の要素までの変更は
arr+1, arr+3 と思いましたが => arr[1], arr[2] だけ変わりました。
arr+1, arr+4 にするとちゃんと => arr[1], arr[2], arr[3] が変わりました。

[arr[0]] [arr[1]] [arr[2]] [arr[3]] [arr[4]] arr[4]のアドレス前までの意味ようです。

2次元配列のすべで要素の値を1にしたい場合

1)各要素の値を直接指定
int arr[5][5]={{1,1,1,1,1},{1,1,1,1,1},{1,1,1,1,1},{1,1,1,1,1},{1,1,1,1,1}};
このようにint arr[5][5]={{1}}; 一つだけ指定すると他には全部0が入ります。
また確認してみたらできませんでした。
int area[M][N]={{1,0,0,0,0},};のように1行のデータの設定は必要でした。

2)std::fill_n利用
int arr[5][5];
fill_n(arr[0],25,1)
fill_n(arr,25,1)はエラーになりました。
arr, arr[0]のアドレスを確認すると同じなのに。。。

3)std::fill利用
int arr[5][5];
fill(arr[0],arr[0]+25,1);


参考:配列の要素個数計算

配列のメモリサイズを最初要素の値のメモリサイズで分けて計算しました。

int arr[5];
int arrSize=sizeof(arr)/sizeof(arr[0]);  => 5
もしくは
int arrSize=sizeof(arr)/sizeof(*arr);    => 5

int arr[5][5];
int size=sizeof(arr)/sizeof(*arr[0]);     => 25
int size=sizeof(arr)/sizeof(arr[0][0]);  => 25

int size=sizeof(arr)/sizeof(*arr); は 5になりました。
これと 先のエラー fill_n(arr,25,1)で類推してみたら
arr: 配列を要素で持っている1次元配列のアドレスを意味
arr[0]: 1次元配列の要素(配列)の最初要素のアドレスを意味
と考えました。

int size=sizeof(arr)/sizeof(*arr);  sizeof(*arr)は
要素(配列)の最初要素で2次元配列の五つの要素を意味,
fill_n(arr,25,1) は
1次元配列として 五つの要素で範囲を25で多くしたのでエラーになったと思いました。

C++ 배열 초기화 std::fill, std::fill_n .. 정리

댓글 없음:

댓글 쓰기

1、2、QWER! in OSAKA (大阪 2025/4/10(木) Yogibo META VALLEY)

https://www.creativeman.co.jp/event/qwer-osaka/ QWER - CREATIVEMAN PRODUCTIONS 主催:LIVET 企画:ソニー・ミュージックソリューションズ 招聘:クリエイティブマンプロダクション 制作協力:クリエイテ...