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을 사용하는 것이 효율적이다.
'👩🏻💻 Programming > C++' 카테고리의 다른 글
auto 변수와 자료형 타입 (0) | 2020.11.09 |
---|---|
exit(0)과 exit(1)의 차이 (0) | 2020.09.18 |
vector<int> v(n)과 vector<int> v[n]의 차이 (0) | 2020.09.08 |
2차원 vector, 그리고 3차원 Vector (0) | 2020.05.06 |
숫자->문자열(to_string), 문자->숫자(stoi) (0) | 2020.03.03 |