반복자는 포인터처럼 동작하도록 만든 클래스 객체
포인터처럼*
,++
,==
연산 설계 (연산자 오버로딩)
컨테이너마다 구조에 맞게 다르게 구현
반복자는 컨테이너의 구간에 대해 값을 읽어올 수 있도록 기능을 제공한다.
모든 컨테이너에 대해서 동일하게 동작하여 값을 얻어올 수 있게 한다.
vector
는 연속된 메모리 → 진짜 포인터처럼 사용 가능list
는 이중 연결 리스트 → 포인터는 안 되고, 내부 구조에 맞는 방식 필요반복자가 필요한 이유 | 설명 |
---|---|
컨테이너와 무관한 반복 | 구조 몰라도 동일한 방식으로 순회 가능 |
범용 코드 작성 | 템플릿 함수 등에 활용 가능 |
STL 알고리즘 사용 | sort, find 등과 함께 쓰임 |
포인터처럼 사용 가능 | *it 로 값 접근, ++it 로 이동 가능 |
반복자는 포인터와 흡사하다.
예를 들어 정수 배열을 가리키는 포인터일 경우 ++연산을 하게 되면 그 다음번 주소의 정수값을 읽을 수 있듯이 반복자 또한 ++ 연산을 적용할 수 있다.
포인터는 그 다음 주소값을 읽어오지만 반복자는 다음번 요소를 읽어온다.
int arr[] = {1, 2, 3, 4, 5};
int* pNum;
for(pNum = &arr[0]; pNum!=&arr[5]; pNum++)
{
cout << *pNum << endl;
}
char arr [] = "programming";
char* pArr = arr;
while(*pArr) {
cout << *pArr << endl;
pArr++;
}
컨테이너<int>::iterator it;
begin()
: 처음 인덱스 요소end()
: 마지막 인덱스 요소vertor 클래스 안에 iterator라는 반복자 타입이 정의되어 있다.
변수 it를 선언하면 벡터의 한 요소를 가리키는 반복자가 된다.
/* vector<int> 벡터이름(처음주소, 마지막주소)
vector<int>::iterator it; */
int arr[] = {1, 2, 3, 4, 5};
vector<int> vArr(&arr[0], &arr[5])
vector<int>::iterator it;
for(it = vArr.begin(); it != vArr.end(); it++)
{
cout << *it << endl;
}
list<int> lst;
list<int>::iterator it;
for(int i = 0; i< 5; i++) {
lst.push_back(i + 1);
}
for(it = lst.begin(); it != lst.end(); it++)
{
cout << *it << endl;
}
int arr[] = {1, 2, 4, 2, 5, 6, 3};
set<int> scon;
for(int i = 0; i < sizeof(arr)/sizeof(arr[0]); i++) {
scon.insert(arr[i]);
}
struct PhoneAddr
{
string name;
int phonenum;
}arPerson[] =
{
{"홍길동",5151},
{"김선생",2535},
{"밧대리",6994},
{"오징어",7774}
};
int main() {
map<string, int> person;
map<string, int>::iterator it;
int i;
string name;
for (i = 0; i < sizeof(arPerson) / sizeof(arPerson[0]); i++) {
person[arPerson[i].name] = arPerson[i].phonenum;
}
for (;;) {
cout << "이름 입력: ", cin >> name;
if (name == "q") break;
it = person.find(name);
if (it == person.end()) {
cout << "그런 사람은 없습니다." << endl;
} else {
cout << name << " 의 전화번호는 " << it->second << "입니다." << endl;
}
}
return 0;
}