bool check[50][50] = { false, };

// 일련의 과정으로 check에는 false와 true가 골고루 입력되었다

int main(void) {
    for (int i = 0; i < 50; i++) {
        for (int j = 0; j < 50; j++) {
            check[i][j] = false;
        }
    }
    return 0;
}

배열을 특정 값으로 초기화 해야하는 경우가 있다고 가정하자.

위와 같은 50*50의 배열의 경우, 2중 for문을 통해 초기화 할 수 있다.

하지만 배열의 크기가 점점 커질수록 메모리 낭비는 심해질 것이다.

 

이때 사용할 수 있는 함수가 memset과 fill이다.

 


Memset : 0(false)으로 채우자

#include <cstring> //memset을 위해 필요하다.
bool check[50][50] = { false, };

// 일련의 과정으로 check에는 false와 true가 골고루 입력되었다

int main(void) {
    memset(check, false, sizeof(check));
    // 변수명, 초기화 하고자 하는 값, 초기화를 원하는 영역(사이즈)

    return 0;
}

컴파일러, 아키텍쳐에 따라 다르나 일반적으로 for문을 연속으로 돌리는 것 보다는 빠른 속도를 낼 수 있다.

단, 1byte단위로 메모리를 초기화하기 때문에 배열의 값을 '0'으로 초기화할때 사용한다.

때문에 bool문을 포함한 다른 타입의 변수도 값을 0으로 초기화 할때만 사용된다.

 

※주의 : cstring 라이브러리를 추가하는 것을 잊지말아야한다.

 


Fill : 당신이 원하는걸로 채우자

<algorithm>헤더파일에 포함되어있으며, std namespace를 사용한다.

memset과는 다르게 여러 자료형에 대해 제약없이 사용할 수 있다.

 

기본적인 사용방법은 fill(시작 위치, 끝나는 위치 +1, 초기화 값)이다.

다양한 사용 예시는 아래를 참고하자.

#define MAX 100

vector<int> v(5);
vector<int> v2(10);
int arr[MAX][MAX];
vector<vector<int>> arr2(5, vector<int>(5));

fill(v.begin(), v.begin()+5, 1) // 1차원 vector을 1로 초기화
fill(v.begin(), v.end, 5) // 1차원 vector을 10으로 초기화
fill(&arr[0][0], &arr[MAX-1][MAX], 10) // 2차원 배열을 10으로 초기화
fill(arr2.begin(), arr2.end(), vector<int>(5,5)); // 2차원 벡터를 5로 초기화 

0으로 값을 초기화할때는 memset, 이 외의 특정 값으로 초기화할때는 fill을 사용하는 것이 효율적이다.