그냥 게임개발자

이터레이터! 본문

C++ 나만의 복습

이터레이터!

sudoju 2024. 4. 7. 15:56

이터레이터는 컨테이너에 저장되어 있는 요소의 주소를 가리키는 개체를 말한다.

그냥 그거다

주소를 가리킨다라고생각하자.

그게 편해나는

 

그리고 컨테이너는 담을 수 있는 공간이라고 생각하는게 편해요

그게 편해 나는

 

암튼 그게 편해!!!!

 

그래서 담을 수 있는 공간을 생각해보자.

vector, map 이런게 있다.

각각 다르게 구현된컨테이너들을 일반화된 이터레이터를 통해 쉽게 순회할 수 있다.

 

여러가지 방법이 있다.

 

배열을 보자.

 

ㅇㅇㅇ

 

그렇다면 리스트는?

 

ㅇㅇ

그러면 스택은?

 

ㅇㅇㅇㅇ

여기서 이런 각각의 컨테이너의 한 주소를 가리키는 개체가 바로 이터레이터이다.

 

오우씨 나 그림 잘그리네

아무튼

 

이터레이터는 주소를 가리키는 개체인데 다만 주소값을 바로 반환하지는 못해서 &*를 통해 한단계 더 거쳐서 가리키는 해당 요소의 주소값을 반환할 수 있다.

 

 

이터레이터를 통해 사용하는 코드를 보자.

#include <iostream>

using namespace std;

vector<int> v;

int main()
{
    for (int i = 1; i <= 5; ++i)
        v.push_back(i);
    
    for (int i = 0; i < 5; ++i)
    {
        cout << i << "번째 요소 : " << *(v.begin() + i) << '\n';
        cout << &*(v.begin() + i) << '\n';
    }
    
    for (auto it = v.begin(); it != v.end(); ++it)
    {
        cout << *it << ' ';
    }
    
    cout << '\n';
    
    for (vector<int>::iterator it = v.begin(); it != v.end(); ++it)
    {
        cout << *it << ' ';
    }
    
    auto it = v.begin();
    
    advance(it, 3);
    cout << '\n';
    cout << *it << '\n';
}

 

 

일단 결과물을 보고 복습해보자.

 

 

일단 어려운 건 없다.

    for (int i = 1; i <= 5; ++i)
        v.push_back(i);

 

초기화 시켜주고

    for (int i = 0; i < 5; ++i)
    {
        cout << i << "번째 요소 : " << *(v.begin() + i) << '\n';
        cout << &*(v.begin() + i) << '\n';
    }

인덱스를 통해 이터레이터의 주소의 *(에스터 리스크를 통해) 값을 참조하게 된다.

근데 그 값의 주소를 알고 싶어서 &*라는 연산자를 사용해 주소도 출력한다.

 

    for (auto it = v.begin(); it != v.end(); ++it)
    {
        cout << *it << ' ';
    }

    for (vector<int>::iterator it = v.begin(); it != v.end(); ++it)
    {
        cout << *it << ' ';
    }

 

그렇다면 이거는 무엇일까

auto를 쓰는 이유는 

vector<int>::iterator

이거 표현하기 귀찮아서 또는 가독성이 좋지 않아서이다.

 

대부분 auto로 쓰긴한다.

 

이터레이터는 주소를 반환한다고 하지 않았나?

그럼 그 주소의 값을 참조하려면 *에스터 리스크를 통해 값을 얻어올수 있다.

ㅇㅇ

그러면 여기서 iterator에서 자주 쓰는 함수 3개를 알아보자.

 

begin()

컨테이너의 시작 위치를 반환

end()

컨테이너의 끝 다음의 위치를 반환한다.
보통 it != v.end()로 조건을 많이 사용한다.
이는 컨테이너를 다 순회하고 컨테이너의 끝에 도착했다는 것을 가리킨다.

advance(iterator, cnt)

해당 iterator를 cnt(count)까지 증가시킨다.