이터레이터

하나의 컨테이너에서 다른 컨테이너로 데이터를 복사하는 copy() 라는 알고리즘이 있는데요. 이 알고리즘은 이터레이터들로 표현됩니다.

copy()에 전달하는 첫 번째, 두 번째 매개변수는 복사할 범위를 지정, 세 번째 이터레이터 매개변수는 첫 번째 항목이 복사될 위치를 가리킵니다. 처음 두 매개변수는 입력 이터레이터(또는 그보다 기능이 많은)고, 마지막 매개변수는 출력 이터레이터입니다.

#include<iterator>
...
ostream_iterator<int, char> out_iter(cout," ");

*out_iter++ = 15;    // cout<<15<<" ";처럼 동작한다.

이제 outer_iter 이터레이터는 cout을 사용하여 정보를 출력할 수 있게 해주는 인터페이스라고 할 수 있습니다. 첫 번째 템플릿 매개변수는 출력 스트림을 보내는 데이터형입니다.
두 번째 템플릿 매개변수는 출력 스트림이 사용하는 문자형을 나타냅니다. ( 출력 스트림에 보내진 각 항목 뒤에 표시되는 분리자)

이름이 있는 이터레이터 대신에 익명 이터레이터를 만들 수도 있구요.

copy(arr.begin(), arr.end(), ostream_iterator<int, char>(cout," ");

같은 논리로, iterator 헤더 파일은 istream 입력을 이터레이터 인터페이스에 맞개 개량하기 위한 istream_iterator 템플릿을 정의한다. 이것은 입력 이터레이터 개념의 모델이다.
이것을 이용하여 copy()에 입력범위를 지정해줄 수 있습니다.

copy(istream_iterator<int, char>(cin), istream_iterator<int, char>(), arr.begin());

생성자 매개변수로, cin을 사용하는 것은, cin이 관리하는 입력 스트림을 사용한다는 뜻입니다.
생성자 매개변수를 생략하는 것은, 입력 실패를 나타냅니다. ( 파일 끝, 데이터형 불일치, 입력 실패)

reverse_iterator

만약 arr 벡터의 내용을 역순으로 뒤집어 출력하려 한다고 합시다. vector 클래스는 past-the-end를 지시하는 reverse_iterator를 리턴하는 rbegin() 이라는 멤버 함수와, 첫 번째 원소를 리턴하는 rend() 멤버 함수를 가지고 있습니다.
따라서, 다음과 같은 구문을 사용하면 

copy(arr.rbegin(), arr.rend(), out_iter);	// 거꾸로 출력

컨테이너 내용을 뒤집어 출력할 수 있습니다. 다만 주의해야 할 사항이 있는데요,

vector<int>::reverse_iterator ri;

ri = arr.rbegin()		//ri에는 past-the-end가 들어가 있습니다.

//그래서 *ri는 앞에 있는 값을 참조해요.
//즉, ri가 여섯 번째 위치를 지시한다면, *ri는 다섯 번째 위치의 값이 되는 것이죠!

 

마지막으로

삽입 이터레이터와 같이 살펴보면 copy()는 한 컨테이너에서 다른 컨테이너로 정보를 복사하는데 사용할 수 있을 뿐만 아니라, 컨테이너에서 출력 스트림으로 또는 입력 스트림에서 컨테이너로 정보를 복사하는 데이도 사용할 수 있습니다.
이것은 미리 정의되어 있는 이러한 이터레이터들이 그 함수들의 기능을 확장시킨다고 할 수 있겠네요.

'C++' 카테고리의 다른 글

STL - 삽입 이터레이터  (0) 2021.02.18

+ Recent posts