# 반복자(Iterator)
C++ 라이브러리는 반복자를 제공하는데 이것을 사용하면 라이브러리의 방식대로 자료구조를 액세스 할 수 있다.
따라서, 라이브러리가 효과적으로 동작한다는 것을 보장 할 수 있다.
■ 반복자의 성질
- 컨테이너와 컨테이너 안에 있는 요소를 구별한다.
- 그 요소의 값을 확인할 수 있다.
- 컨테이너 안에 있는 요소들 간에 이동할 수 있는 연산을 제공한다.
- 컨테이너가 효과적으로 처리할 수 있는 방식으로 가용한 연산들을 한정시킨다.
■ 인덱스를 사용하는 방법과 반복자를 사용하는 방법
/* 인덱스를 사용하는 방법 */
for(vector<Student_info>::size_type i = 0; i != students.size(); ++i)
{
cout<< students[i].name <<endl;
}
/* 반복자를 사용하는 방법 */
for(vector<Student_info>::const_iterator iter = students.begin();
iter != students.end(); ++iter)
{
cout<< (*iter).name <<endl;
cout<< iter->name <<endl;
}
■ 반복자 타입- 모든 표준 컨테이너는 두 종류의 반복자 타입을 가집니다.
(1) container-type::const_iterator // 값을 읽기만 할 때 사용
(2) container-type::iterator // 값의 변경이 있을 때 사용
iterator 타입은 const_iterator 타입으로 자동으로 변환될 수 있지만, 그 역은 성립되지 않는다.■ <vector>와 <list>의 반복자의 차이반복자가 가리키는 요소를 삭제 할 경우 그 반복자는 무효화 된다.vector에 대해 erase를 호출하면 방금 삭제된 요소 다음에 있는 요소들을 가리키는 모든 반복자는 무효화 된다.
또한 push_back을 사용하여 vector에 요소를 추가해도 해당 vector를 가리키고 있던 모든 반복자는 무효화 된다.
vector에 한 요소를 삭제하면 그 다음 요소들이 이동되고, 한 요소를 추가하면 새로운 요소를 위한 공간을 확보하기 위해 전체 vector가 재할당 되기 때문이다.
하지만 list에서는 erase나 push_back이 다른 요소들에 대한 반복자를 무효화 시키지 않고 실제로 삭제된 요소를 가리키는
반복자만 무효화 시킨다. 왜냐하면 그 요소는 더이상 존재하지 않기 때문이다.
■ 반복자 연산
iterator iter;
*iter : 반복자 iter를 역참조 하여 iter가 가리키는 위치에 저장된 값을 얻는다. 또한(*iter).x처럼 .과 함께 사용하여 클래스 객체의
멤버를 얻는다.
it->x : (*iter).x와 동일하며, 반복자 iter를 역참조하여 얻는 객체의 멤버 x를 리턴한다.
++iter, iter++ : 반복자를 증가시켜 컨테이너의 다음 요소를 가리키게 한다.
b==e,b!=e : 비교 연산에서도 동작한다.