반복자(iterator)
반복자(iterator)
포인터의 일반화라고하며 반복자는 포인터를 그대로 흉내내어 임의의 컨테이너에 저장된 모든 요소를 순서대로 가리킬 수 있다. 반복자의 목적은 컨테이너 내부 순회에 있다.
1. 컨테이너의 요소 하나를 가리키는 기본적인 역할을 한다.
2. 가리키는 지점의 요소를 읽고 쓸 수 있다. 내용을 읽는 * 연산자가 정의된다.
3. 증감에 의해 주변 요소로 이동할 수 있다. ++, -- 등의 연산자가 정의된다.
4. 반복자끼리 대입, 비교 가능해야 한다. 대입, 비교 연산자가 정의된다.
컨테이너에 대해 어떤 작업을 하고 싶다면 컨테이너에 저장되어 있는 요소에 접근해야 하므로 순회가 꼭 필요하다.
반복자 카테고리 |
기능 |
제공자 |
입력 반복자 |
전방향 읽기 |
istream |
출력 반복자 |
전방향 쓰기 |
ostream, inserter |
전방향 반복자 |
전방향 읽기, 쓰기 |
|
양방향 반복자 |
전방향, 역방향 읽기, 쓰기 |
list, set, multiset, map, multimap |
랜덤 엑세스 반복자 |
랜덤 액세스 |
vector, deque, string, array |
입력 반복자(Input Iterators)
입력 반복자는 오로지 원소를 전진 방향으로만 "읽기(read)" 액세스할 수 있는 반복자이다.
표현식 |
효과 |
*iter |
실제 원소에 대한 읽기(read) 액세스를 제공한다. |
iter->member |
실제 원소의 멤버에 대한 읽기(read) 액세스를 제공한다. |
++iter |
전방향으로 전진한다.(새로운 위치를 반환한다) |
iter++ |
전방향으로 전진한다.(예전 위치를 반환한다) |
iter1 == iter2 |
두 반복자가 같은지 판별한다 |
iter1 != iter2 |
두 반복자가 같지 않음을 판별한다. |
TYPE(iter) |
반복자를 복사한다.(복사 생성자) |
출력 반복자(Output Iterators)
출력 반복자는 입력 반복자와 매우 비슷한 반복자이다. 이 출력 반복자는 오로지 원소를 전진 방향으로만 "쓰기(write)" 액세스를 할 수 있는 반복자이다. 입력 반복자의 경우 비교할 필요가 없다.
표현식 |
효과 |
*iter = value |
반복자가 참조하는 곳에 value를 기록한다.(l-value로만 사용.) |
++iter |
전방향으로 전진한다.(새로운 위치를 반환한다) |
iter++ |
전방향으로 전진한다.(예전 위치를 반환한다) |
TYPE(iter) |
반복자를 복사한다.(복사 생성자) |
전방향 반복자(Forward Iterators)
전방향 반복자는 입력 반복자인 동시에 출력 반복자인 반복자를 의미한다. 전방향 반봊가는 입력 반복자의 모든 기능과 출력 반복자의 대부분의 기능을 가지고 있다.
표현식 |
효과 |
*iter |
실제 원소에 대한 읽기(read) 액세스를 제공한다. |
iter->member |
실제 원소의 멤버에 대한 읽기(read) 액세스를 제공한다. |
++iter |
전방향으로 전진한다.(새로운 위치를 반환한다) |
iter++ |
전방향으로 전진한다.(예전 위치를 반환한다) |
iter1 == iter2 |
두 반복자가 같은지 판별한다 |
iter1 != iter2 |
두 반복자가 같지 않음을 판별한다. |
TYPE() |
반복자를 생성한다.(디폴트 생성자) |
TYPE(iter) | 반복자를 복사한다.(복사 생성자) |
iter1 = iter2 |
반복자를 대입한다. |
양방향 반복자(Bidirectional Iterators)
양방향 반복자는 원소를 역순으로 순회할 수 있는 기능을 추가한 전방향 반복자이다. 따라서 연순으로 순회하기 위한 감소 연산자를 제공한다.
표현식 |
효과 |
*iter |
실제 원소에 대한 읽기(read) 액세스를 제공한다. |
iter->member |
실제 원소의 멤버에 대한 읽기(read) 액세스를 제공한다. |
++iter |
전방향으로 전진한다.(새로운 위치를 반환한다) |
iter++ |
전방향으로 전진한다.(예전 위치를 반환한다) |
--iter |
역방향으로 전진한다.(새로운 위치를 반환한다) |
iter-- |
역방향으로 전진한다.(예전 위치를 반환한다) |
iter1 == iter2 |
두 반복자가 같은지 판별한다 |
iter1 != iter2 |
두 반복자가 같지 않음을 판별한다. |
TYPE() |
반복자를 생성한다.(디폴트 생성자) |
TYPE(iter) | 반복자를 복사한다.(복사 생성자) |
iter1 = iter2 |
반복자를 대입한다. |
랜덤 액세스 반복자(Random Access Iterators)
랜덤 액세스 반복자는 랜덤 액세스를 할 수 있는 양방향 반복자이다. 랜덤 엑세스 기능을 지원하므로, 이 반복자는 +, - 와 같은 반복자 연산자를 제공할 뿐만 아니라 오프셋을 더하거나 뺄 수도 있고 <, > 연산자를 사용하여 두 반복자를 비교할 수도 있다.
표현식 |
효과 |
iter[n] |
인덱스가 n인 원소의 액세스를 제공한다. |
iter+=n |
n원소 만큼 전방향 전진한다.(n이 음수라면 역방향 전진) |
iter-=n |
전방향으로 전진한다.(새로운 위치를 반환한다) |
iter+n |
전방향으로 전진한다.(예전 위치를 반환한다) |
n+iter |
역방향으로 전진한다.(새로운 위치를 반환한다) |
iter-n |
역방향으로 전진한다.(예전 위치를 반환한다) |
n-iter |
두 반복자가 같은지 판별한다 |
iter1 - iter2 |
두 반복자가 같지 않음을 판별한다. |
iter1 < iter2 |
반복자를 생성한다.(디폴트 생성자) |
iter1 > iter2 | 반복자를 복사한다.(복사 생성자) |
iter1 <= iter2 |
반복자를 대입한다. |
iter1 >= iter2 |
출처 - 혼자 연구하는 C/C++, The C++ Standard Library : A Tutorial and Reference