반복자
컨테이너와 알고리즘이 하나로 동작하게 묶어주는 인터페이스 역할
반복자의 특징
- 반복자는 컨테이너 내부의 원소(객체)를 가리키고 접근할 수 있어야 한다.(*연산자 제공)
- 반복자는 다음 원소로 이동하고 컨테이너의 모든 원소를 순회할 수 있어야 한다.(++ 연산자 제공, !=, == 비교연산자 제공)
컨테이너 원소(객체)의 집합 = 순차열(sequence)
순차열은 원소의 순서 있는 집합, 하나의 시작과 하나의 끝을 같는다. = 투 포인터를 갖는다.
STL은 시작과 끝을 가리키는 begin( ) 과 end( )가 순차열의 시작과 끝을 가리키는 반복자를 반환한다.
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<int> v;
v.push_back(10);
v.push_back(20);
v.push_back(30);
v.push_back(40);
v.push_back(50);
for (int i = 0; i < v.size(); i++) {
cout << v[i] << " ";
}
vector<int>::iterator iter;
for (iter = v.begin(); iter != v.end(); iter++) {
cout << *iter << endl;
}
return 0;
}
- v.begin() : 컨테이너의 시작 원소를 가리키는 반복자를 반환
- v.end() : 컨테이너의 끝 원소를 가리키는 반복자를 반환
- ++iter : 반복자를 다음 원소를 가리키도록 이동
- *iter : iter가 가리키는 원소를 반환(역참조)
Deque의 임의 접근 반복자
#include <iostream>
#include <deque>
using namespace std;
int main() {
deque<int> dq;
dq.push_back(10);
dq.push_back(20);
dq.push_back(30);
dq.push_back(40);
dq.push_back(50);
deque<int>::iterator iter = dq.begin(); //시작 반복자로 iter설정
cout << iter[0] << endl;
cout << iter[1] << endl;
cout << iter[2] << endl;
cout << iter[3] << endl;
cout << iter[4] << endl;
iter += 2; //반복자를 2칸 이동
cout << *iter << endl;
cout << endl;
deque<int>::iterator iter2 = iter+2; //2칸 이동되어있는 iter반복자에 2칸 이동시킨 위치의 반복자 선언
cout << *iter2 << endl;
return 0;
}
Deque는 First-In-First-Out 구조로 Vector와 같은 배열 기반 컨테이너로 똑같이 동작합니다.
- iter[i]: iter+i 원소에 접근
- iter += n : iter를 n만큼 이동
- iter2 = iter + n : iter위치에 +n한 위치의 반복자를 iter2에 대입합니다.
처음 iter는 deque의 begin() 위치를 가리키고 있고 iter += 2로 2번 이동한 위치를 가리키게 합니다.
그럼 처음 출력은 10에서 2번 이동한 30을 출력합니다.
iter2 에는 iter의 2번이동한 위치를 가리키게 하므로 30에서 2번 이동한 50을 출력합니다.
'C++ > STL' 카테고리의 다른 글
[STL] 어댑터 (0) | 2025.03.03 |
---|---|
[STL] 알고리즘 Algorithm (0) | 2025.03.03 |
[STL] 컨테이너 ( container ) (0) | 2025.03.01 |
[STL] STL 시작 (1) | 2025.03.01 |
[STL] 4장 문제풀이 (0) | 2025.02.21 |