Home » 레퍼런스 » C++ » c++ fill 함수로 배열과 벡터 등을 초기화 해 봅시다.

c++ fill 함수로 배열과 벡터 등을 초기화 해 봅시다.

c언어의 memset 함수는 byte 단위로 값을 초기화 하는 함수라고 하였습니다. 당연하게도, 특정 값은 초기화가 되지 않고 0xABABABAB 패턴만 초기화가 됩니다. 2와 3은 이 패턴에서 벗어나기 때문에 되지 않는 문제가 있어요.

그래서 제가 속 편하게 그냥 c++ fill 함수를 쓰던지, for loop를 돌리는 것이 낫다고에서 이야기를 했는데요. 이번 시간에는 그 함수를 알아보겠습니다.


c++ fill 함수

해당 함수의 원형은 아래 그림과 같습니다.

[그림 1] fill 함수의 원형
  • first, last
    • 특정한 값으로 초기화 하는 범위
    • first는 포함하지만 last는 포함하지 않습니다.
  • val
    • 초기화를 하는 값

즉, first로부터 last 전 까지 특정한 값 val로 초기화를 하는 함수라고 보면 됩니다. 공식 를 보면, 아래와 동일한 로직을 수행한다고 되어 있어요.

[그림 2] fill 함수의 구현

뭔가 어려워 보이는데요. 사실 별로 어렵지 않습니다. first로 넘겨진 것이 arr+1이고, last로 넘겨진 것이 arr+3이라고 해 보겠습니다.

배열 arr은 위와 같이 선언되어 있습니다. 채우는 값이 3이라고 해 보겠습니다.

arr+1부터 봅시다. 이 위치는 arr+3과는 같지 않으니 3으로 채워집니다.

다음 arr+2입니다. 이 위치 역시 arr+3과 같지 않으니 3으로 채워집니다.

다음에 arr+3입니다. 이것은 last 위치인 arr+3과 같으므로 채워지지 않습니다. 따라서 이 단계에서 빠져나가게 됩니다. memset는 byte 단위로 채워나갑니다. 하지만, 이 함수는 아예 iterator가 가리키는 공간에 값을 채워나가게 됩니다. 따라서, 2와 3 같은 것으로 초기화를 해도 제대로 동작합니다.


몇 가지 fill 함수 예제

그러면 몇 가지 예제들을 보겠습니다.

[그림 3] 예제 1번 프로그램

먼저 1번 프로그램을 보겠습니다. 배열이 주어졌습니다. 범위는 arr+1부터 arr+3 까지인데요. 첫 위치는 포함하지만 끝 위치는 포함하지 않습니다. 즉, arr+1, arr+2 위치에 3을 집어넣겠다는 의미입니다.

[그림 4] 예제 1번 프로그램의 결과

결과를 보면, 1, 2번째 위치에만 2가 들어가 있음을 볼 수 있습니다.

[그림 5] 예제 2번 프로그램

2번째 예제를 보겠습니다. vector는 stl을 이용해서 문제를 풀면 상당히 많이 쓰이는데요. 벡터의 첫 위치는 v.begin(), 끝 위치는 v.end()입니다. 대략적으로 그림을 그리면 아래와 같아요.

마지막 원소의 다음 위치가 v.end()입니다. 즉, 범위가 v.begin(), v.end()가 주어졌다는 의미는

  • 1번째 위치부터
  • v.end() 직전인 가장 마지막 위치까지 특정한 값으로 채우겠다.

는 의미입니다. 그리고, 9 ~ 10번째 줄에서, 전체 vector를 순회하면서 벡터 내부에 있는 원소들을 출력하고 있습니다.

[그림 6] 예제 2번 프로그램의 결과

결과를 보면, 전체 벡터의 원소가 3으로 초기화 되었음을 볼 수 있습니다.

Leave a Comment

16 + 20 =