오늘 문득 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)
가장 명확하게 보인다.