// 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+10y로복사한다.

 

        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는 전방향!!

}

 

Tag |

Trackback Address :: 이 글에는 트랙백을 보낼 수 없습니다