배열을 사용하여 알고리즘 문제를 풀다보면 가끔 배열을 특정 값으로 초기화시켜 줘야 할 때가 있다.

1
int arr[10] = { -1, };

일반적으로 C++에서 배열을 초기화할 때 위과 같은 코드를 사용하기도 하는데 해당 코드를 실행한 뒤 배열 안에 있는 값을 확인해 보면 arr[0]만 -1로 초기화되고 나머지 값들은 모두 0으로 초기화된 것을 볼 수 있다.

그럼 특정 값으로 배열 전체를 초기화하는 방법에 대해서 알아보자.


1. memset을 이용하는 방법

1
2
int arr[10];
memset(arr, 0, sizeof a);

memset을 이용하여 배열을 초기화할 땐 주의사항이 있다.

1
void* memset(void* ptr, int value, size_t num );

memset의 함수 원형이다.

  • ptr: 값을 채울 메모리 블록에 대한 포인터
  • value: 설정할 값. int로 전달되지만 unsigned char변환을 사용하여 메모리를 채운다.
  • num: 값으로 설정할 바이트 수.

여기에서 주목해야 할 것은 해당 항목이다.

int로 전달되지만 unsigned char변환을 사용하여 메모리를 채운다.

배열의 값을 3으로 초기화하려고 memsetvalue값에 3을 넣게 되면 이상한 값이 나오게 된다. 이유는 배열 크기만큼의 모든 바이트에 3(0b00000011) [← unsigned char로 변환됨] 을 대입했기 때문이다.

따라서 memset 함수를 이용해 초기화를 하려 할 땐 0(00000000)과 -1(11111111)로만 초기화할 수 있다.


2. for문을 이용하는 방법

1
2
3
4
int arr[10];
for(int i = 0; i < 10; i++){
    a[i] = 3;
}

for문으로 배열을 모두 돌면서 값을 직접 바꾸어 주는 방식이다.


3. fill, fill_n을 이용하는 방법 (⭐⭐⭐추천!)

1
2
3
int arr[10];
fill(arr, arr + 5, 3);
fill_n(arr, 5, 3);

fill 함수의 경우 두 번째 파라미터로 변경하려는 원소 개수가 들어가고,
fill_n 함수의 경우 두 번째 파라미터로 변경하려는 원소의 range 종료 주소 + 1이 들어간다. 범위가 [first, last)라고 생각하면 된다.

실수할 만한 것도 없고 코드도 짧기 때문에 마지막 방법을 이용하는 것을 가장 추천한다.

태그:

카테고리:

업데이트:

댓글남기기