티스토리 뷰

728x90

C++ 로 코딩테스트를 준비하던 도중, vector 이터레이터는 +1이 가능한데 list 이터레이터는 +1이 불가능한 이유가 궁금해서 공부하고 정리해보겠습니당~


Iterator 반복자 

 ' 어떤 container(자료구조)에 접근하든 동일한 방법으로 접근하기 위해서 제공되는 객체 '

 

 

 일종의 포인터와 비슷한 iterator라이브러리의 방식대로 자료구조를 액세스하기 위해서 존재합니다.

 

 C++ STL이 제공하는 자료구조는 각자 서로 다른 방법으로 내부의 요소에 접근합니다. 자료구조마다 각기 다른 방식으로 자료구조를 탐색하기 때문에, 반복자에도 여러가지 종류가 있습니다. 따라서 vector 이터레이터는 +1이 가능한 반면에, list 이터레이터는 +1이 불가능합니다. 


 

Iterator로 가능한 작업

1. 자료 구조 안에 있는 요소를 구별하기

2. 자료 구조 안에 있는 요소의 값 확인하기

3. 해당 컨테이너가 제공하는 연산으로 자료구조 안에 있는 요소들 간에 이동하기

     - (자료구조의 성질을 기반으로 처리할 수 있는 연산들 한정) 

4. 포인터와 비슷하게 간접 참조하기

    = 포인터 변수가 저장하고 있는 주소를 찾아가서 그 주소에 있는 변수를 사용하는 연산자 

 

 

Iterator로 가능한 작업

1. 컨테이너에 없는 요소를 가리키면 에러가 발생

2. 컨테이너가 중간에 변경될 경우 기존의 iterator는 정상적으로 작동 불가능

 


Iterator의 종류

 STL의 모든 컨테이너 혹은 함수들은 다양한 종류의 Iterator를 지원합니다. 이때, Iterator중에서 어떤 종류의 Iterator를 지원 하느냐에 따라 사용할 수 있는 연산과 함수들이 달라집니다. 반복자는 input, output, forward, bidirectional, random access로 갈 수록 가능한 작업들이 많아집니다. 

 

 따라서 컨테이너마다 지원하는 반복자의 종류가 다르기 때문에, 사용하고자 하는 컨테이너가 지원하는 Iterator가 어떤 종류인지 알아야합니다. 

 

1. 입력 반복자 (input iterator) : istream_iterator

2. 출력 반복자 (output iterator) : ostream_iterator, inserter, front_inserter, back_inserter

3. 순방향 반복자 (forward iterator)

4. 양방향 반복자 (bidirectional iterator) : list, set, multiset, map, multimap

5. 임의 접근 반복자 (Random access iterator) : 일반 포인터, vector, deque

 

* stack, queue, priority_queue 는 어댑터 컨테이너이기 때문에 iterator를 사용하지 않는다.

* 어댑터 컨테이너 : 기존 컨테이너의 인터페이스를 제한하여 만든 기능이 제한되거나 변형된 컨테이너, 특정 형태의 동작만을 수행한다.

 

C++ 레퍼런스 번역 출처 : https://cplusplus.com/reference/iterator/

 

 

 

 모든 이터레이터는 ++ (증가 연산자) 사용과 iterator의 선언이 가능합니다. 입력(input)및 출력 반복자(output iterator)는 가장 제한된 유형의 반복자입니다.

 

 입력 반복자(input iterator)의 경우 ++, ==, != 연산이 가능하며, dereference를 통해 참조된 값을 읽기(Read)만 가능합니다.

 

 출력 반복자(output iterator)의 경우 ++ 연산만 가능하며, 쓰기(Write)만 가능합니다. 


 순방향 반복자(forward iterator)는 입력 반복자의 모든 기능을 가지며 , const iterator가 아닌 경우 출력 반복자의 기능도 갖습니다. 단, 범위를 반복하는 한 방향(정방향)으로 제한됩니다. vector,list,map,set,dequeue과 같은 모든 표준 컨테이너는 최소한 정방향 반복자 유형을 지원합니다. 즉, 읽기(Read) 쓰기(Write) 접근(Access) 가능하며, ++,==,!= 연산이 가능합니다.

*const iterator: iterator와 달리 값을 수정할 수 없는 iterator


 양방향 반복자(bidirectional)는 정방향 반복자와 비슷하지만 역방향으로 반복할 수도 있습니다. 따라서, ++연산과 더불어 --연산도 가능합니다. 읽기(Read) 쓰기(Write) 접근(Access)이 가능하며 비교 연산 ==, !=도 가능합니다. list, set, map은 양방향 반복자를 지원합니다. 이 양방향 반복자를 지원하지 않는 컨테이너는 알고리즘 헤더의 reverse() 함수를 사용할 수 없습니다. 

랜덤 액세스 반복자(Random Access)는 양방향 반복자 의 모든 기능을 구현하고 범위에 비순차적으로 액세스하는 기능도 있습니다.사이에 있는 모든 요소를 ​​반복하지 않고 반복자에 오프셋 값을 적용하여 멀리 있는 요소에 직접 액세스할 수 있습니다. 이러한 반복자는 표준 포인터와 유사한 기능을 갖습니다(포인터는 이 범주의 반복자입니다).  따라서, 배열처럼 [ ] 인덱스로 접근이 가능합니다. 즉, 읽기(Read) 쓰기(Write) 접근(Access) 가능하며, ++,--, + , - 산술 연산 ==,!=, > , < , >= , <= 비교연산이 가능합니다. vector, deque는 랜덤액세스 반복자를 지원합니다.

* 첨자 연산 [], itr[n] ==*(itr+n)

 

참고 사이트:

https://cplusplus.com/reference/iterator/

https://ansohxxn.github.io/stl/chapter16-2/

https://spenshi.tistory.com/entry/C-%EB%B0%98%EB%B3%B5%EC%9E%90iterator

https://www.geeksforgeeks.org/output-iterators-cpp/

728x90

'👩🏻‍💻개발공부 > C++' 카테고리의 다른 글

[C++] cin, cout, getline 예제로 알아보기  (0) 2023.01.04
250x250
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
글 보관함