C , C++, C#

[C/C++] iterator (반복자)

vhxpffltm 2019. 12. 11. 21:39

STL을 사용하는 프로그래머라면 반복자는 간단하게라도 알고가야한다.

 

반복자가 어떻게 동작하는지 간단하게 보고가자

 

보통 vector<int> v 가 있을때, 우리가 begin(), end() 를 사용할 수 있는 이유가 반복자 때문이다.

 

여기서 간단하게 순환 가능한 반복자를 만들어보자.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class num_it {
    int i;
public:
    explicit num_it(int position = 0) : i{ position } {}
    int operator*() const { return i; } // 반복자(*it)를 참조하면 정수 반환
    num_it& operator++() {
        ++i;
        return *this;
    }//반복자가 증가하면 내부 숫자 카운터 i증가
    bool operator!= (const num_it &a) const {
        return i != a.i;
    }//for반복문은 현재 반복자를 끝 반복자와 비교, 같지 않으면 계속 순환
};
 
class num_range {
    //반복자 클래스, 순환해 시작과 끝을 포함하는 중개 객체용
    int a;
    int b;
public:
    num_range(int s, int e) : a{ s }, b{ e } {} // a부터 b까지를 의미
    num_it begin() const { return num_it(a); } // 우리가 보통 사용하는 begin() 클래스가 num_it이다.
    num_it end() const { return num_it(b); } // 우리가 보통 사용하는 end() 클래스가 num_it이다.
};
 
http://colorscripter.com/info#e" target="_blank" style="color:#e5e5e5text-decoration:none">Colored by Color Scripter
 

 

하나뿐인 맴버변수 i 는 숫자를 세는데 사용한다. 생성자를 생성하고 position으로 기본값을 준다. 

*연산자는 정수를 반환하고 ++연산자는 내부 숫자 카운터 i를 증가시킨다.

 

보통 for 반복문으로 현재 반복자와 끝 반복자를 비교하게 된다. != 연산자를 통해 같지 않으면 계속 순환한다.

 

다음 num_range 클래스는 시작과 끝 반복자를 포함하는 클래스이다. 두 개의 맴버 변수 a,b가 있는데 'a부터 b까지' 의 의미를 가지게 된다. 

그리고 begin() 과 end() 함수를 구현하였다.

 

1
2
3
for (auto i : num_range(110)) {
        cout << i << " , ";
    }
http://colorscripter.com/info#e" target="_blank" style="color:#e5e5e5text-decoration:none">Colored by Color Scripter
 

 

위의 코드를 실행해보자. 어떤 결과값이 뜨는지 알 수 있다. 

 

그렇다면 필자가 한번씩 사용하던 컨테이너에서 사용하던 방법은 아래와 같다.

 

map과 set의 순환에 대해서만 살펴보자.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
map<intint> mp;
    set<int> st;
    mp.insert(11 });
    mp[1]++;
    mp.insert(2,2 });
    mp[3= 10;
    st.insert(1);
    st.insert(2);
    cout << "map : ";
    for (auto i = mp.begin(); i != mp.end(); i++) {
        cout << i->first << "  " << i->second << endl;
    }
    cout << "set : ";
    for (auto i = st.begin(); i != st.end(); i++) {
        cout << *<< "  ";
    }
http://colorscripter.com/info#e" target="_blank" style="color:#e5e5e5text-decoration:none">Colored by Color Scripter
 

 

어떤 결과가 나오는지 예측할 수 있을것이다. 반복자는 참조자처럼 생각하여 for문에서 순환할 때, 위와 같이 작성하여 STL컨테이너에 접근할 수 있는 방법을 제공한다.

 

반복자의 기본적인 순환 클래스를 보면 위 코드를 더 쉽게 이해할 수 있을것이다.