2.2.2 array 컨테이너에서 반복자 사용하기
array 템플릿에는 begin(), end() 멤버가 정의되어 있다. begin(), end()는 예상대로 첫 번째 원소와 마지막 원소에서 하나 더 뒤를 가리키는 랜덤 액세스 반복자를 각각 반환한다. 1장에서 살펴본 것처럼 랜덤 액세스 반복자는 가장 많은 기능을 가졌으므로 모든 연산이 가능하다. 명시적으로 반복자를 사용해서 height_ins 컨테이너의 값을 설정하는 루프를 코드로 작성할 수 있다.
unsigned int h {min_ht}; auto first = height_ins.begin(); // 첫 번째 원소를 가리키는 반복자 auto last = height_ins.end(); // 끝에서 하나 더 뒤를 가리키는 반복자 while (first != last) { *first++ = h; // 현재 원소에 h를 저장하고 반복자를 증가시킨다 h += ht_step; }
반복자 객체 first와 last는 array 객체의 begin()과 end() 멤버 함수가 반환한 것이다. auto 키워드를 사용한 덕분에 선언문에서 반복자의 진짜 타입을 걱정하지 않아도 된다. 그러나 정말 타입이 궁금한 독자도 있을 테니 살짝 소개하자면 array<T,N> 타입 안에 정의된 iterator 타입을 뜻하는 std::array<unsigned int,19>::iterator가 실제 타입이다. 코드를 보면 반복자 객체는 일반 포인터처럼 사용되었다. 후위 연산자 ++는 값을 원소에 저장한 이후에 first를 증가시킨다. first가 end와 같아지면 모든 원소를 설정한 것이므로 루프를 종료한다.
1장에서 설명한 것처럼 컨테이너의 반복자를 얻을 때는 전역 함수 begin()과 end()를 범용적으로 응용할 수 있으므로 이들 함수를 사용하는 것이 더 좋다. 이를 함수를 이용하면 first와 last를 다음과 같이 정의할 수 있다.
auto first = std::begin(height_ins); // 첫 번째 원소를 가리키는 반복자 auto last = std::end(height_ins); // 끝에서 하나 더 뒤를 가리키는 반복자