begin() / end()

보물창고·2022년 9월 1일
0

반복자 꺼내기

  • 보통 stl 컨테이너 멤버를 사용했음.
    -> 변수.begin(), 변수.end()를 사용함.

  • 특징
    : 일반 배열의 경우 사용할 수 없음.

  • begin() , end() 함수 형식으로 인자를 넣어서 사용하자.

problem

가) template show 함수를 만들어라. 일단은 멤버 형식으로 설정하자.
나) 벡터 컨테이너를 보내서 출력하라.

다) 배열을 보내서 출력하라.
: 배열은 stl과는 다르게 멤버로 begin() , end()가 없어서 에러 발생한다.

마) 멤버가 아닌 함수로 인자 받아서 사용하자.
: 멤버함수가 아닌 , 자체 구현된 begin() 과 end() 사용하면 문제 없음!

-> 배열도 처리할 수 있음.

실제로 begin(), end()는 어떻게 구현되어 있을까에 대해서

원리에 대해 알아 보는 것임.

  • stl 컨테이너를 처리하는 버전과 일반 배열을 처리하는 버전 2종류가 구현됨!
    -> 이전의 포스트들에서 배웠던 배열의 실제 타입인 int(&)[N] 을 사용하고
    있는 것을 확인할 수 있다.
//일반함수 begin() / end()
// 1. 컨테이너 버전
template<typename T> auto xbegin(T& c) { return c.begin(); }
template<typename T> auto xend(T& c) { return c.end(); }

// 2. 배열 버전
template<typename T, int N> auto xbegin(T(&r)[N]) { return r; }
template<typename T, int N> auto xend(T(&r)[N]) { return r + N; }

template<typename T> void show(T& c)
{
    auto p = xbegin(c);

    while (p != xend(c))
    {
        cout << *p << " ";
        ++p;
    }
    cout << endl;
}

int main()
{
    vector<int> v = {1, 2, 3, 4, 5, 6, 7, 8, 9};
    show(v);

    int arr[5] = {9, 8, 7, 6, 5};
    show(arr);
}
  • 실제 구현되어 있기 때문에 만들 필요 없다.

  • 실제 코드
    : 총 4종류가 있다.

  1. 컨테이너를 받는 begin 인데, 수정불가와 수정 가능한 함수 2개.

  2. initialize_list를 인자로 받는 함수

  3. 일반 배열을 받는 방식.
    end를 보면, Array 포인터에다가 마지막 인덱스를 가산하고 있는 것을 확인할 수 있다.

profile
🔥🔥🔥

0개의 댓글