더북(TheBook)

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;
}

반복자 객체 firstlastarray 객체의 begin()end() 멤버 함수가 반환한 것이다. auto 키워드를 사용한 덕분에 선언문에서 반복자의 진짜 타입을 걱정하지 않아도 된다. 그러나 정말 타입이 궁금한 독자도 있을 테니 살짝 소개하자면 array<T,N> 타입 안에 정의된 iterator 타입을 뜻하는 std::array<unsigned int,19>::iterator가 실제 타입이다. 코드를 보면 반복자 객체는 일반 포인터처럼 사용되었다. 후위 연산자 ++는 값을 원소에 저장한 이후에 first를 증가시킨다. firstend와 같아지면 모든 원소를 설정한 것이므로 루프를 종료한다.

1장에서 설명한 것처럼 컨테이너의 반복자를 얻을 때는 전역 함수 begin()end()를 범용적으로 응용할 수 있으므로 이들 함수를 사용하는 것이 더 좋다. 이를 함수를 이용하면 firstlast를 다음과 같이 정의할 수 있다.

auto first = std::begin(height_ins);  // 첫 번째 원소를 가리키는 반복자
auto last = std::end(height_ins);     // 끝에서 하나 더 뒤를 가리키는 반복자
 

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.