iterator
를 통해서 컨테이너와 알고리즘을 분리할 수 있으며, 인터페이스를 고치지 않고 새로운 순회 구조 또한 구현할 수 있다.iterator
를 구성함으로써 더 generic
한 프로그래밍을 구현하는데 큰 도움이 된다.STL container
의 내부 데이터 접근/순회 방식으로 iterator
를 사용한다. iterator
를 통해서 다양한 형태의 구조에 대해서 마치 포인터와 같이 데이터를 접근할 수 있으며, std::algorithm
에서도 다양한 컨테이너에 공통적으로 존재하는 iterator
를 통해서 공통된 작업을 수행할 수 있다.array
, vector
, string
과 같은 클래스의 경우 내부 데이터를 가리키는 포인터 연산을 통해서 내부 데이터를 순회하며 algorithm
에 있는 다양한 템플릿 함수를 사용할 수 있겠지만, map
, set
, list
, deque
와 같이 연속적인 데이터를 가지지 않는 컨테이너의 경우 단순히 포인터 연산만으로는 내부 데이터를 순회할 수 없다. 이 때, iterator
를 통해 오버로딩된 operator
를 이용하면, 내부 자료 구조를 이해하지 않더라도 포인터 연산과 유사한 방법으로 내부 데이터를 순회할 수 있다.자료 2) OLD_GCC libstdC++ (C++98)
: iterator
를 끝까지 파고 들어가면 다음과 같은 구조만 덩그라니 있다.
template <class _Category, class _Tp, class _Distance = ptrdiff_t,
class _Pointer = _Tp*, class _Reference = _Tp&>
struct iterator {
typedef _Category iterator_category;
typedef _Tp value_type;
typedef _Distance difference_type;
typedef _Pointer pointer;
typedef _Reference reference;
};
std::iterator
는 스스로 아무것도 할 수 없다. 결국 자료구조에 따라, iterator
의 동작은 별개로 정의해야한다. 하지만, iterator
를 generic
하게 사용하기 위해서는 유저가 정의한 iterator
안에 위에 정의된 iterator
의 요소들을 가지고 있어야한다.iterator
는 wrapping
혹은 상속을 통해서 위 구조를 내부적으로 가지고 있다. 이 과정에서 iterator_traits
가 이용된다.iterator_traits
에서 들고 있는 tag
를 바탕으로, 이후 opreator
가 제한된다.