반응형

STL 컨테이너에 저장된 요소를 반복적으로 순회하여, 각각의 요소에 대한 접근을 제공하는 객체


특징

  • 가리키는 요소의 값에 접근
  • 반복자 사이의 대입 연산, 비교 연산
  • 가리키는 요소의 주변 요소로 이동

종류

  • 입력 반복자
  • 출력 반복자
  • 순항향 반복자
  • 양방향 반복자
  • 임의 접근 반복자

입력 반복자

컨테이너로부터 값을 읽는 데 사용(변경 X)

증가 연산자(++)를 사용하여 순방향으로만 이동 가능

참조 연산자(*)를 사용하여 요소 참조

ex) find()

출력 반복자

컨테이너의 값을 변경하는 데 사용(읽기 X)

증가 연산자(++)를 사용하여 순방향으로만 이동 가능

참조 연산자(*)를 사용하여 한 번 요소 변경 가능

ex) copy()

순방향 반복자

입출력 모두 가능 -> 다중 패스 알고리즘에 사용 가능

증가 연산자(++)를 사용하여 순방향으로만 이동 가능

참조 연산자(*)를 사용하여 요소를 참조하거나 변경 가능

ex) replace()

양방향 반복자

입출력 모두 가능

증감연산자(++/--)를 사용하여 양방향 이동 가능

참조 연산자(*)를 사용하여 요소를 참조하거나 변경 가능

ex) reverse()

임의 접근 반복자

양방향 반복자의 모든 기능 포함 + 일반 포인터가 하는 거의 모든 일

증감연산자(++/--)를 사용하여 양방향 이동 가능

첨자 연산자([])를 통해 임의의 요소에 접근 가능

산술 연산자(+, -)와 관계 연산자(<, <=, >, >=) 사용 가능

ex) sort()


계층

반복자는 계층적으로 분류

다양한 반복자를 사용하여 알고리즘의 적용 조건을 제한


기타 반복자

스트림 반복자

반복자 연산을 통해 알고리즘이 입출력 스트림에 쉽게 접근

입출력 스트림을 각각 입출력 반복자로 변환하는 방식으로 제공

istream_iterator, ostream_iterator 클래스 템플릿에서 제공

vector<int> vc = {1, 2, 3, 4, 5};
copy(vc.begin(), vc.end(), ostream_iterator<int>(cout));
// 12345
cout<<endl;
copy(vc.begin(), vc.end(), ostream_iterator<int>(cout));
// 1 2 3 4 5

삽입 반복자

그 요소의 위치에 새로운 값을 삽입 cf) 출력 반복자: 가리키는 요소의 값 덮어쓰기

  • insert_iterator - insert() : 해당 컨테이너의 특정 위치에 삽입, 모든 컨테이너에 사용 가능
  • back_insert_iterator - push_back(): 해당 컨테이너의 뒤쪽에 삽입, 시퀀스 컨테이너(vector, list, deque)에 사용 가능
  • front_insert_iterator - push_front(): 해당 컨테이너의 앞쪽에 삽입, list, deque에 사용 가능
list<int> ls = {10};
ls.push_back(20);
ls.push_front(30);
copy(ls.begin(), ls.end(), ostream_iterator<int>(cout, " "));
// 30 10 20

역방향 반복자

순방향 반복자와 반대 방향으로 동작하는 반복자

역방향 반복자의 증가 연산자(++)은 순방향 반복자의 역방향으로 이동

rbegin(), rend() 멤버 함수를 사용하면 자동으로 reverse_iterator 반환

list<int> ls = {10, 20, 30};
copy(ls.rbegin(), ls.rend(), ostream_iteraot<int>(cout, " "));
// 30 20 10

상수 반복자

반복자가 가리키는 값의 변경이 불가능한 반복자(이동하여 다른 요소를 가리키는 것은 가능)

const_iterator 타입

list<int> ls = {10, 20, 30};
list<int>::iterator iter;
list<int>::const_iterator citer;

iter = ls.begin();
*iter = 100;
citer = ls.end();
// *citer = 300;

for(citer = ls.begin(); citer != ls.end(); ++citer)
    cout<<*citer<<" ";
// 100 20 30
반응형

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

[C++] STL - priority_queue  (0) 2020.12.21
[C++] STL - queue  (0) 2020.12.21
[C++] string library  (0) 2020.11.27
[C++] cout 부동소수점 다루기  (0) 2020.11.20
[C++] STL - deque  (0) 2020.11.13

+ Recent posts