iterator는 배열의 요소를 가르키는 포인터다.
C++에서는 반복자를 제공하는데, 이를 사용하면 컨테이너에 저장된 원소를 순회하고 접근하여 효과적으로 자료를 접근할 수 있다. 포인터와 비슷한 개념이지만 이는 컨테이너(Vector, dequeue, list, string 등)
이 반복자 덕분에 특정 컨테이너에 종속적이지 않게 언제든지 컨테이너와 결합하여 동작할 수 있다.
반복자는 * 연산자를 사용하여 컨테이너 내부의 원소를 가리키고 접근할 수 있어야 하며,
++, != == 등의 이항연산자를 사용하여 다음 원소로 이동하고 컨테이너의 모든 원소를 순회할 수 있어야 한다.
선언
vector<int>::iterator iter; // vector 반복자 iter 선언
초기화
// vector 반복자 iter는 v의 시작점을 가리킴 iter = v.begin();
임의접근
cout << iter[1] << endl;
연산 사용
iter += 5; // += 연산 사용 cout << *iter << endl;
📌 양방향 반복자 (list ,set 등)에서는 바로 앞뒤 ++, --만 가능한 것 같다.
vector의 순방향
for (iter = v.begin(); iter != v.end(); iter++) { cout << *iter << endl; }
혹은 java 11버전 이상에선
for (auto iter: v) cout << iter << endl;
** 양방향 반복자 : list, set, multiset, map, multimap
** 임의 접근 반복자(+, -, +=, -=, []연산 가능) : vector, deque
#include "pch.h"
#include <iostream>
#include <vector>
using namespace std;
int main(void)
{
vector<int> v;
for (int i = 0; i < 7; i++) {
v.push_back(10 * i);
}
vector<int>::iterator iter;
// vector 반복자 iter는 v의 시작점을 가리킴
iter = v.begin();
cout << &iter << endl;
cout << *iter << endl;
// 임의 접근
cout << iter[1] << endl;
iter += 2; // += 연산 사용
cout << &iter << endl;
cout << *iter << endl;
// 반복
for (iter = v.begin(); iter != v.end(); iter++) {
cout << *iter << endl;
}.
return 0;
}
여기서 유의해야할 점은, 임의 접근은 인덱스를 통해 접근하여 해당 값을 리턴하는 거지, iter가 가리키는 값을 바꾼다는 것은 아니다.
접근하는 위치를 바꾸려면 이항연산을 사용하면 된다.
연결리스트의 iterator가 어디를 가리키고 있는지, 리스트의 메소드가 어떤 위치를 액션하고 어떤 위치를 반환하는지 잘 알아둬야겠다.
⭐ insert(t, 값) : iterator t가 가리키는 곳 앞에 값을 삽입
⭐ erase(t) : t 위치의 값을 제거한 뒤 (📌t 위치 원소 왼쪽이 아니다!) 다음 원소의 값을 반환하니까 반드시 반환값을 받아줘야한다.
👉🏻 source