C++ 배열 초기화
보통 C++로 코딩을 하거나, C#으로 코딩을 할때 각각 vector와 List를 많이 사용하지만,
자료구조 문제를 풀때는 고정된 크기만큼 할당을 해야하는 조건이 붙는 경우가 많다.
ex) 조건 1. 배열의 크기는 1000보다 작아야한다.
위와 같은식으로 조건이 붙는다. 하지만 간단한 배열은 초기화를 해주면 되지만,
배열의 크기가 클 경우에는 일일히 초기화가 아니라 간단히 초기화 해줄 수 있는 방법이 C++에서 제공된다.
std:fill
해당 함수의 매개변수는 아래와 같다.
void fill(const _FwdIt _First, const _FwdIt _Last, const _Ty& _Val)
첫 인자인 first 부터 last까지 마지막 Type val로 채운다는 뜻이다.
해당 fill 함수는 아래와 같이 사용할 수 있다.
// 시작 idx, idx + 개수, 초기화 값
fill(Arr[0], Arr[0] + 100, 1);
이차원 배열을 초기화 할 때, fill 또는 fill_n 함수를 사용하면 시간이 매우 절약 된다.
이중 for문으로 초기화 하는 미련한 짓은 하지 마시길....
std:fill_n
해당 함수의 매개변수는 아래와 같다.
_OutIt fill_n(_OutIt _Dest, const _Diff _Count_raw, const _Ty& _Val)
첫 인자인 _Dest 부터 해당 갯수만큼 Type val로 채운다는 뜻이다.
즉, fill과는 다르게 초기화를 n 만큼 할 수 있다는 뜻이다.
fill(Arr[0], Arr[0] + 100, 1); = fill_n(Arr[0], 100, 1); 과 동일하다.
그리고 fill_n은 초기화 시작원소가 배열의 첫번째가 아니여도 상관이 없다.
fill_n(Arr[0] + 10, 100, 1) 이렇게 사용도 가능하다.
memset
해당 함수의 매개변수는 아래와 같다.
void* memset(void* _Dst, int _Val, size_t _Size);
첫 인자인 ptr가 가르키는 메모리 주소부터 size_t의 Size만큼(byte가 자료형) _Val로 채운다는 뜻이다.
그리고 두번째 인자인 Val은 int형이지만 unsigned char 자료형으로 해석한다.
memset(Arr, 0, sizeof(Arr)); 과 같이 사용할 수 있다.
하지만 포인터 형식으로 메모리를 제어하므로, 단점이 뚜렷하다.
- 사용할 때, 특정 값으로 제한된다.
1) 1바이트 배열 : 256 미만의 값
2) 1바이트 초과 배열 : 0과 -1만 가능
개인 견해
저는 실상 알고리즘 문제를 푸는 경우가 아니라면, C++에선 vector, C#에서는 List를 사용합니다.
하지만 ... 실무에서 10~20년전에 만들어진 옛날 프로그램들을 수정해야하는 경우가 진짜 간헐적으로 있더라구요.
그럴 경우 memset을 사용해야 할 때가 있습니다.
하지만 배열의 초기화를 할 경우에는 0과 -1로 초기화 할때만 memset을 사용하고,
그 외의 값으로 초기화를 해야하면 std:fill, 또는 std:fill_n을 사용하는게 좋을 것 같네요.
'🔥 Programming > C++' 카테고리의 다른 글
[C/C++] 동적할당 malloc, calloc, realloc들의 차이란? (0) | 2023.01.10 |
---|---|
[C/C++] C++ auto keyword의 장점과 단점 (0) | 2022.11.27 |
[C/C++] C++ 벡터 사용시, () 선언과 [] 선언의 차이 (0) | 2022.10.14 |
[C/C++] C++ ios_base::sync_with_stdio(false), cin.tie(0) (0) | 2022.08.19 |