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(1, 10)) {
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<int, int> mp;
set<int> st;
mp[1]++;
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 << *i << " ";
}
http://colorscripter.com/info#e" target="_blank" style="color:#e5e5e5text-decoration:none">Colored by Color Scripter
|
어떤 결과가 나오는지 예측할 수 있을것이다. 반복자는 참조자처럼 생각하여 for문에서 순환할 때, 위와 같이 작성하여 STL컨테이너에 접근할 수 있는 방법을 제공한다.
반복자의 기본적인 순환 클래스를 보면 위 코드를 더 쉽게 이해할 수 있을것이다.
'C , C++, C#' 카테고리의 다른 글
[C/C++] Shared_ptr (0) | 2020.01.06 |
---|---|
[C/C++] unique_ptr (0) | 2019.12.28 |
[C/C++] C++ 17 문법 unpacking(언패킹), 구조체 바인딩 (0) | 2019.12.09 |
[C/C++] #if #elif #endif 조건부 컴파일 (0) | 2019.12.04 |
[C/C++] #define 매크로, #undef, size_t (0) | 2019.12.03 |