// 1. 개념. 용어
반복자는(Iterator)는 포인터와 유사한 객체로서 STL의 알고리즘 함수가 컨테이너에 저장된 객체들의 시퀀스를 순회 할 때 사용한다. 컨테이너와 알고리즘 함수의 사이를 연결해주는 중간자로서의 역할을 담당하기도 한다. 반복자 덕택에 저장방식(자료구조)에 관계없이 동일한 알고리즘 함수를 구현 할 수 있는 것이다.
STL의 각 컨테이너는 자신의 요소를 가르키는 반복자를 가지고 있다. 각 컨테이너의 begin(), end() 함수는 자신이 지닌 첫번째 요소와 마지막 다음(past-the-end) 요소를 가르키는 반복자를 리턴한다.
반복자 구간 ? 시퀀스의 시작을 가르키는 first, 마지막 다음을 가르키는 last의 반복자 한 쌍. 반복자 구간은 [first, last] 처럼 표기한다. 또한, first에서 시작해서 operator++ 연산으로 도달 가능한 경우 유효(Valid, 도달가능-reachable)한 구간이라고 한다. 모든 STL의 알고리즘은 넘겨 받은 구간이 유효하다는 가정하에 작업을 수행한다. 또한 아무 요소도 없는 구간은
first == last
가 되는데 이를 빈 구간(empty)라고 한다. 빈 구간도 유효한 구간이다.
Past the end ? Container의 end() 함수를 통해서 얻게 되는 iterator는 마지막 요소가 아니라 마지막 다음을 가르키는데 이를 보통 past-the-iterator라고 부른다. 이 iterator를 참조하는 것은 오류이다.
// 2. 반복자의무효화
void main()
{
vector<int> v(10);
v[0] = 100;
vector<int>::iterator p = v.begin();
cout << *p << endl;
// v.resize(20); // 반복자를 무효화 시킨다.p가 가리키는 곳을 재할당
v.resize(5); // 무효화 될 가능성이 있다. 메모리를 줄이기만 한다.
cout << *p << endl;
}
///////////////////////////////////////////////////////////////////
// 3. 반복자의 활용
void main()
{
list<int> s;
s.push_back(10);
s.push_back(20);
s.push_back(30);
s.push_back(40);
slist<int>::iterator p1 = s.begin();
cout << *p1 << endl;
slsit<int>::iterator p2 = s.end();
reverse( p1, p2 )
}
///////////////////////////////////////////////////////////////////
void main()
{
vector<list<int> > st(10); // hash table
st[0].push_back(10);
vector<string> v(10);
v[0][0] = 'a';
string s = "ahfsdhksdfkshdfkjhsdkfhsdkfh";
sort(s.begin(), s.end());
reverse( s.begin(), s.end());
replace( s.begin(), s.end(), 'f', '-');
cout << s << endl;
}
// 반복자의분류- 5가지
int main()
{
list<int> s; // 양방향반복자
sort( s.begin(), s.end()); // 임의접근이어야한다.
s.sort(); // Quick 이아닌버블이나selection 으로구현됨.
int x[10] = { 1,2,3,4,5,6,7,8,9,10};
int y[10];
copy( x, x+10, y); // x ~ x+10을y로복사한다.
const int x[10] = { 1,2,3,4,5,6,7,8,9,10};
int k = *x; // ok..
*x = 20; // error
slist<int> s;
// s에요소추가...
slist<int>::iterator p = s.begin();
int k = *p; // 입력
*p = 30; // 출력
++p; // ok...
--p; // 될까?? 안된다. single linked list는 전방향!!
}