상세 컨텐츠

본문 제목

[STL] 반복자(2) - 입출력 반복자

C++/C++ STL

by deulee 2023. 8. 23. 15:27

본문

입력 반복자 (Input Iterator)

입력 반복자는 가장 기본적인 기능만 제공하는 반복자이다.

 

'읽는 것'만 가능한 반복자로서 요소의 값을 변경하는 것은 불가능하다.

a = *it; // 가능
*it = a; // 불가능

그 외에는 증감 및 비교가 가능하다.

 

즉, 검색하는데 사용되며 단순히 값을 읽기만 하는 동작이므로 요소의 값을 변경하는 것은 필요치 않는다.

 

이러한 조건을 만족하는 반복자를 '입력 반복자'라고 한다.

 


출력 반복자

출력 반복자는 반대로 '*' 연산자를 사용하여 요소의 내용을 변경할 수 있는 반복자이다.

 

쓰기가 가능하면 출력 반복자라고 할 수 있으며 읽기 기능이 필수는 아니다. 또한, 범위 점검을 위한 ==, != 연산자도 필수가 아니다.

 

즉, '전진하면서 기록 가능'하다는 조건만 만족하면 '출력 반복자'라고 할 수 있다.

*it = a; // 가능
a = *it; // 필요치 않음

활용

그럼 이것이 왜 필요할까?

 

예를 들어 반복자 구간끼리 복사하는 copy 알고리즘을 살펴보도록 하자.

OutIt copy(InIt first, InIt last, OutIt result)
{
	while (first != last)
		*result++ = *first++;
	return result;
}

Init(입력 반복자), OutIt(출력 반복자)를 나타내는 것을 보자.

 

위의 예제에서 복사할 원본의 내용은 바뀔 이유가 없으며 읽기만 하면 된다. 즉, InIt 타입이다. 또한, 복사 목적지 'result'의 경우는 오로지 출력만하며 다시 읽을 필요가 없으므로 OutIt 타입이다.

 

두 유형의 반복자는 '입출력 스트림'에만 적용된다. 왜냐하면 STL의 컨테이너들은 모두 읽기, 쓰기가 동시에 가능하기 때문에 더 높은 레벨의 반복자를 지원한다.

 


입•출력 스트림 반복자

입력, 출력 반복자의 일종인 입출력 스트림 반복자는 콘솔에 연결된 반복자이다.

 

'i(o)stream_iterator'라는 클래스로 정의되어 있으며 이 반복자를 사용하면 '표준 입력'으로 내용을 순회하면서 읽어낼 수 있고 '표준 출력'으로 문자를 출력할 수도 있다.

#include <iostream>
#include <list>
#include <iterator>

int main(void)
{
	int arr[] = {1, 2, 3, 4, 5};
	std::list<int> larr(&arr[0], &arr[5]);

	std::ostream_iterator<int> oit(std::cout, " ");
	copy(larr.begin(), larr.end(), oit);
	return 0;
}

위의 예제에서는 `std::ostream_iterator<int>`를 생성하여 `std::cout` (표준 출력 스트림)과 연결했다.

 

그리고 `copy` 알고리즘을 통해 `larr`의 원소를 `*oit`에 대입하여 출력을 한다. 이것이 가능한 이유는 'cout''=' 연산자에 오버로딩을 해놔서 출력이 되는 것이다.

 

#include <iostream>
#include <iterator>
#include <vector>

int main(void)
{
	std::vector<int> vi(5);
	std::istream_iterator<int> iit(std::cin);

	copy(iit, std::istream_iterator<int>(), vi.begin());
	std::ostream_iterator<int> oit(std::cout, " ");
	copy(vi.begin(), vi.end(), oit);
	return 0;
}

반대로 입력 스트립 반복자를 이용하여 입력도 가능하다.

 

이때 입력의 끝을 나타내는 Ctrl+D를 입력하면 입력을 종료할 수 있다.

 

 

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

[STL] 반복자(4) - 임의 접근 반복자  (0) 2023.08.23
[STL] 반복자(3) - 순방향, 양방향 반복자  (0) 2023.08.23
[STL] 반복자(1)  (0) 2023.08.23
[STL] 컨테이너  (0) 2023.08.23
[STL] STL의 구조  (0) 2023.08.23

관련글 더보기