배열을 초기화할 때 int a[10] = {0, }; 과 같이 초기화하기도 하고 fill() 이나 memset() 을 사용하기도 한다.
위 방법들의 사용법, 장단점을 정리해보자.
1. std::fill()
fill()은 O(n)의 시간복잡도를 가지며 fill (first, last, val) 으로 초기화한다.
모든 값으로 초기화 가능하며 [first, last)까지 val로 초기화된다. 일부 값만 초기화할 수도 있긴하다.
아래 코드는 배열 a[10], b[10][10] 의 모든 값을 0으로 초기화하는 과정이다.
int a[10];
int b[10][10];
fill(&a[0], &a[10], 0);
fill(&b[0][0], &b[9][10], 0);
a[10] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
b[10][10] = { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
...
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } }
크기 10의 벡터 또한 fill()을 사용하면 0으로 초기화 가능하다.
vector<int> v(10);
fill(v.begin(), v.end(), 0);
2. memset()
memset()은 배열을 바이트단위로 초기화하며 0 또는 -1 또는 char 문자로만 초기화 가능하다.
배열만 초기화 가능하므로 string은 초기화할 수 없다. 사용 방법은 memset (ptr, value, size) 로 초기화할 수 있다.
char c[] = "hello";
int i[5];
memset(c, 'a', 3);
memset(i, 0, sizeof(i)); //sizeof(i) == 20
문자 배열과 정수배열을 다음과 같이 초기화하면
c[] = "aaalo"
i[5] = {0, 0, 0, 0, 0} 이 나온다.
0, -1 값으로 초기화할 때 memset을 사용하는 것이 좋다.
3. {0, }
a[N] = {0, } 과 같은 초기화 방법은 정적초기화에서만 유효하다. 동적 초기화에서는 동작하지 않는다.
정적초기화란 처음 자료형을 정의할 때 초기화하는 경우만을 말한다.
따라서 int a[10] = {0, }; 은 배열 a의 모든 값을 초기화하지만, a[5] = {0, };은 그렇지 않다.
사용에 주의를 기하여야한다.
추가로 벡터를 초기화할 때 vector<int> v(5,100); 을 하면
5개의 요소를 담을 수 있는 벡터 v를 선언하고 그것들을 100으로 초기화한다.
즉 vector<int> v = {100,100,100,100,100}; 과 동일하다.
4. for문
for문으로 각각 직접 초기화할 수도 있긴 하다. 실수할 확률이 적고 쉽기 때문에 괜찮은 방법이다.
'C++' 카테고리의 다른 글
[C++] 정렬 함수 : sort() (0) | 2024.02.02 |
---|---|
[C++] 벡터,배열 복사하기 : copy() (0) | 2024.02.02 |
[C++] string 클래스의 멤버함수 : c_str() (0) | 2024.02.02 |
[C++] bitset 라이브러리 (0) | 2024.01.17 |
[C++] cmath (0) | 2024.01.17 |