'C++' Iterator

토스트·2024년 12월 19일

'C++' basic

목록 보기
9/35

반복자 (Iterator)

컨테이너의 요소들을 순차적으로 접근하는 데 사용되는 객체입니다. 즉, 데이터 구조의 각 항목에 대해 반복하면서 요소를 읽거나 수정할 수 있는 방법을 제공합니다. 반복자는 주로 C++ 표준 라이브러리에서 제공하는 컨테이너(예: vector, list, map, set 등)와 함께 사용되며, 컨테이너의 내부 구조에 관계없이 데이터를 처리할 수 있게 해줍니다.

반복자 선언 예시

vector<int>::iterator vIt1;
vector<int>::const_iterator vIt2;

명시적으로 iterator을 선언하기보다는 대부분의 경우 auto를 사용하는 것이 코드의 간결성과 가독성 측면에서 더 좋습니다. 다만, 타입의 특성을 명확히 해야 하거나 디버깅이 중요한 경우에는 명시적으로 iterator를 사용하는 것이 유리할 수 있습니다.

종류

입력(Input) 반복자

한 번에 하나의 요소만 읽을 수 있는 반복자입니다. 입력 반복자는 읽기 전용으로, 반복자를 통해 컨테이너에서 데이터를 읽는 작업만 가능합니다. 주로 순차적이고 일회성 접근을 할 때 사용됩니다.

지원하는 연산

  • ++ : 반복자를 한 단계 전진시킵니다.
  • * : 해당 반복자가 위치해있는 요소의 값을 읽습니다.
  • ==, != : 서로 다른 반복자가 가리키는 위치가 같은지 비교합니다.
  • -> : 반복자가 가리키는 객체의 멤버에 접근할 수 있습니다.
it++; // it 반복자가 가리키는 위치를 한 단계 전진시킵니다.
cout << *it << endl; // it 반복자가 가리키고 있는 요소의 값을 읽습니다.
if (it1 == it2) // it1과 it2가 가리키는 위치가 같은지 비교합니다.
cout << it->size(); // 반복자가 가리키고 있는 멤버에 접근합니다.
    
*it = "Hi"; // Error : 수정할 수 없습니다.

출력(Output) 반복자

요소를 쓰기만 할 수 있는 반복자입니다. 이 반복자는 컨테이너에 데이터를 삽입하는 데 사용됩니다. 읽기는 불가능하고, 쓰기 작업에 특화되어 있습니다.

지원하는 연산

  • ++ : 반복자를 한 단계 전진시킵니다.
  • * : 해당 반복자가 위치해있는 요소의 값을 수정할 수 있습니다.
it++; // it 반복자가 가리키는 위치를 한 단계 전진시킵니다.
*it = "Hi"; // it 반복자가 가리키는 위치의 요소를 수정합니다.

cout << *it; // Error : 읽을 수 없습니다.
if (it1 == it2) // Error : 비교 연산이 불가능합니다.
cout << it->size(); // Error : 멤버 변수에 접근할 수 없습니다.

순방향(Forward) 반복자

입력 반복자와 출력 반복자을 결합한 반복자로, 순방향으로 반복자를 이동시키며 컨테이너 요소를 읽거나 쓸 수 있습니다. 한 번 읽거나 쓴 후에는 다시 그 위치로 돌아갈 수 없지만, 반복자를 여러 번 사용할 수 있다는 장점이 있습니다.

cout << *it << endl;
*it = "Hi"; 

양방향(Bidirectional) 반복자

순방향 반복자를 포함하는 반복자로, 앞뒤 양방향으로 이동할 수 있는 반복자입니다.

list, set, map

it--; // it 반복자가 가리키는 위치를 한 단계 후진시킵니다.

임의접근(Random Access) 반복자

양방향 반복자를 포함하는 반복자로, 반복자는 배열처럼 임의의 위치로 이동할 수 있으며, 데이터에 접근하는데 시간 복잡도가 일정합니다. 배열의 인덱스 연산자( [] )와 유사하게 동작하여, 매우 효율적인 요소 탐색이 가능합니다.

vector, deque

지원하는 연산

  • ++, --, +, -, +=, -= :
  • * : 해당 반복자가 위치해있는 요소의 값을 읽거나 수정할 수 있습니다.
  • ==, !=, >, <, >=, <= : 서로 다른 반복자가 가리키는 위치를 비교합니다.
  • -> : 반복자가 가리키는 객체의 멤버에 접근할 수 있습니다.
  • it[n] : n번 째 요소를 출력합니다.
it += 2; // it 반복자가 가리키는 위치를 두 단계 전진시킵니다.
if(it1 < it2) // it2가 it1보다 뒤에 있으면 true를 반환합니다.
cout << it[5]; // 반복자가 가리키는 컨테이너의 5번 쨰 요소를 출력합니다.

0개의 댓글