서론
스트림 반복자(stream iterator)는 입력 스트림 반복자(istream_iterator)이면 스트림에서 읽고,
출력 스트림 반복자(ostream_iterator) 이면 스트림에 쓰는 단일 패스 반복자(single pass iterator)이다.
이 두 가지의 특징은 다음과 같다.
종류 | 특징 |
입력 스트림 반복자(istream_iterator) |
1. 스트림에서 데이터를 텍스트 모드로 추출할 수 있는 입력 반복자이다. 바이너리 스트림과는 사용할 수 없다. 2. 시작 반복자는 읽어올 첫 번째 값을 가리키고, 끝 반복자는 파일의 끝(end-of-file, EOF) 스트림 상태일 때 알아낼 수 있다. 3. 단일 패스 반복자(single pass iterator)이다. |
출력 스트림 반복자(ostream_iterator) |
1. 타입 T의 객체를 텍스트 모드로 출력 스트림에 쓸 수 있는 출력 반복자이다. 2. 단일 패스 반복자(single pass iterator)이다. |
입력 스트림 반복자(istream_iterator)
iterator 헤더에 정의된 istream_iterator 템플릿은 (>>)연산자를 사용해서 스트림에서 타입 T의 값을 읽어 들인다.
이렇게 동작하려면 istream 객체에서 타입 T의 값을 읽어올 수 있도록 operator>>() 함수 오버로드가 정의되어 있어야 한다. 기본적으로 스트림은 char 타입의 문자들을 담고 있다고 가정한다.
입력 스트림 반복자 생성 |
입력 스트림 객체를 생성자에 전달해서 istream_iterator 객체를 생성할 수 있다. 다음은 입력 스트림 반복자를 생성한다.
기본적으로 스트림은 char 타입의 문자들을 담고 있다고 가정하므로 다른 타입의 문자들을 담은 스트림을 읽으려면
입력 스트림 반복자를 정의해야 한다. 아래는 wchar_t 타입을 받는 스트림 반복자를 생성하는 방법이다.
- 첫 번째 문장은 whcar_t 문자로 된 입력 파일 스트림을 정의한 것이다.
- 두 번째 문장은 파일을 읽기 위해 스트림 반복자를 정의한다. 스트림의 문자 타입은 istream_iterator의 두 번째 인자에 타입 인수를 지정하였으며 여기서는 wchar_t로 지정했다. 스트림에서 읽어올 객체의 타입을 지정하는 첫 번째 인수도 wstring이어야 하는데 이는 wstring이 wchar_t 문자들의 문자열 타입이기 때문이다.
입력 스트림 반복자 예시 |
cin에서 int 타입의 값을 읽을 수 있는 입력 스트림 반복자를 생성했다.
루프는 스트림 상태가 EOF가 될 때까지 입력 스트림 반복자를 사용해서 값을 모두 읽어서 더한다.
출력 스트림 반복자(ostream_iterator)
입력 스트림 반복자 예시
iterator 헤더에 정의된 ostream_iterator 템플릿은 (<<) 연산자를 사용해서 스트림에서 타입 T의 값을 읽어 들인다.
이렇게 동작하려면 istream 객체에서 타입 T의 값을 쓸 수 있도록 operator<<() 함수 오버로드가 정의되어 있어야 한다.
첫 번째 인자에는 쓰려는 값의 타입을
두 번째 인자에는 스트림의 문자 타입을 넣으면 된다. 두 번째 인자의 기본값은 char이다.
출력 스트림 반복자 예시 |
words 컨테이너를 출력 스트림 반복자를 이용해서 출력하는 예제이다.
한 가지 주의 사항이 있는데
string 타입에 문자 타입을 넣으려고 하면 오류가 발생하게 된다.
사용자 정의 자료형(user defined) 기반 스트림 반복자
어떤 클래스 타입이라도 스트림 반복자를 사용하려면 삽입 연산자(<<)와 추출 연산자(>>)를 반드시 오버 로드해야 한다.
출처 및 레퍼런스
Book: C++14 STL철저 입문 아이버 호튼, 조현태
'프로그래밍 > Modern C++' 카테고리의 다른 글
[C++] 2차원 Vector의 초기화 (0) | 2020.04.13 |
---|---|
[C++] 용어 정리(1) 객체지향 철학, 객체지향 디자인 원칙(SOLID) (0) | 2020.03.22 |
[C++] 연관 컨테이너 맵(map) (0) | 2020.02.18 |
[C++] 포인터(Pointer)를 컨테이너(Container)에 저장하기 (0) | 2020.02.15 |
[C++] 템플릿(Template) 멤버변수의 초기화 (0) | 2020.01.30 |