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로 크게 잡으니 에러가 되었다고 생각하고 있습니다.
'C++' 카테고리의 다른 글
Part 1: 메모리동적할당-해제,cmath,bitset....C++ 책 반납 전 소소한 정리(C/C++ 로 작동시키는 Raspberry Pi 3) (0) | 2019.02.05 |
---|---|
Xcode의 c++프로젝트에서 ofstream으로 파일작성이 안될때 처리 (0) | 2019.02.05 |
C++ cout,cin 을 빠르게 (0) | 2019.02.01 |
Visual Studio Community 2017에서 SFML 라이브러리를 사용하기위한 설정 (0) | 2019.01.29 |
macOS High Sierra의 Xcode에서 SFML을 사용하기 위한 설정 (0) | 2019.01.29 |