C++에는 사실 다양한 종류의 반복자를 가지고 있다. 그리고 반복자마다 가능한 동작, 불가능한 동작이 따로 있다.
그리고 STL의 containter마다 지원되는 iterator도 달라서 숙지할 필요가 있다.
우선 카테고리는 아래와 같다.
더 큰 범주를 나타내는 iterator는 순서대로 Random Access iterator > Bidirectional iterator > Forward iterator > Input/Ouput iterator이다.
우선 모든 iterator들은 복사, 대입 연산이 가능하며 디폴트 복사생성자가 있으며 ++ 연산이 가능하다(Note: --는 Bidirection부터 된다).
Input Iterator는 복사, 대입, 비교(==, !=), 역참조(*, ->를 사용하되 rvalue로만 사용 가능. *iter1 = 3 이렇게 lvalue로는 불가능하고 foo(*iter) 이런식으로 rvalue로만 역참조 가능)가 가능하다.
Output Iterator는 복사, 대입, 비교(==, !=), 역참조(*, ->를 사용하되 Input iterator와 반대로 lvalue로만 사용 가능)가 가능하다.
Forward Iterator는 Input/Output Iterator의 기능들을 모두 사용 가능하다.
Bidirectional Iterator는 앞의 Iterator의 기능을 모두 포함하면서 동시에 --연산이 가능해서 앞/뒤로 이동이 가능하다. list, set, map container가 이 Bidirectional Iterator를 사용하므로 Bidirection Iterator가 지원하지 않는 기능인 +, -, +=, -= 같은 연산이 안된다. list, set, map이 bidirectional iterator를 사용한다.
Random Access Iterator는 역시 앞의 모든 기능들을 포함하면서 동시에 산술 연산(+, -, +=, -=), 비교 연산(<, >, <=, >=), 역참조 연산자([])가 지원된다. vector, deque가 random access iterator를 사용한다.
따라서 vector에는 iterator에 2를 더하는 산술 연산을 해도 random access iterator를 사용해서 에러가 뜨지 않지만 list의 bidirectional iterator는 산술 연산이 지원되지 않기 때문에 빨갛게 에러가 뜬다.
Reference
http://www.cplusplus.com/reference/iterator/
https://en.cppreference.com/w/cpp/iterator
https://ansohxxn.github.io/stl/chapter16-2/
'공부 > C || C++' 카테고리의 다른 글
C++ 연산자 오버로딩(Operator overloading) (0) | 2021.07.22 |
---|---|
함수 호출 규약(Calling convention) (0) | 2021.07.20 |
네임스페이스(namespace)란? std란? (0) | 2021.07.19 |
C++ 대입 연산자는 왜 void로 선언하면 안될까? 반환 타입에 왜 참조자를 붙여야 할까? (0) | 2021.07.18 |
C++11 chrono (0) | 2021.07.16 |