[STL] fill 알고리즘 사용시 주의점

STL 2010. 6. 19. 10:37 Posted by zetz

오늘 문득 fill 알고리즘을 사용하다가 착각하기 쉬운 부분이 보여 이렇게 기록 남깁니다.

 

다들 아시다시피 제너릭 fill 알고리즘은 기본 배열에서도 사용할 수 있으며, 아래와 같은 서명을 갖습니다.

 

fill(_FwdIt _First, _FwdIt _Last, const _Ty& _Val)

 

두 개의 Iterator, 또는 포인터 를 받아 _Val 에 해당하는 값으로 초기화 하며 , 여기서 주의할 점은 두 번째 파라메터입니다.

벡터나, 리스트등과 같은 제너릭 컨테이너의 경우에는 begin()과 end() 함수를 사용하여 특별히 착각할 여지가 없는데, 배역에 적용할 경우에는 약간의 주의가 필요합니다.

기본적으로 1차원 배열 v[100] 을 숫자 7로 초기화 하는 코드는 다음과 같습니다.

Fill(&v[0], &v[100], 7);

여기서 주의할 점은 크기가 100인 배열에서 100번의 인덱스는 존재하지 않으며, &v[100] 은 정확히 끝 지난 포인터 (past the end) 에 해당합니다. 많은 제너릭 알고리즘들이 매개변수로 받는 반복자들에서 끝 지난 반복자(past the end)를 사용합니다.

 

"머야 다 알고 있는 것들이자나"

이라고 생각하신 분들을 위해 추가로 그럼, 2차원 배열에서는 어떻게 될까요?

스샷으로 대체하겠습니다.

 

5x5 배열 초기화

 

Fill(&data[0][0], &data[5][5], 1)

 

Fill(&data[0][0], &data[4][5], 2)

 

Fill_n(&data[0][0], 5*5, 3)

가장 명확하게 보인다.