본문 바로가기

C++

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로 초기화 한다는 것이

항상 int arr[5]={1,}로 해서 틀리곤 했습니다. ㅜㅜ


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

식으로 표현하면 한 줄로 알아보기 쉬울것 같습니다.

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]의 메모리주소를 종료주소로 해줘야 arr[3]까지 포함되네요.


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},}; 로 한줄은 해줘야 나머지가 모두 0이 들어갔습니다.

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차원배열의 5개 원소중 하나를 의미,

fill_n(arr,25,1) 는

1차원배열로서 5개 원소인데 범위를 25로 크게 잡으니 에러가 되었다고 생각하고 있습니다.

반응형