보통 stl 컨테이너 멤버를 사용했음.
-> 변수.begin(), 변수.end()를 사용함.
특징
: 일반 배열의 경우 사용할 수 없음.
begin() , end() 함수 형식으로 인자를 넣어서 사용하자.
가) template show 함수를 만들어라. 일단은 멤버 형식으로 설정하자.
나) 벡터 컨테이너를 보내서 출력하라.
다) 배열을 보내서 출력하라.
: 배열은 stl과는 다르게 멤버로 begin() , end()가 없어서 에러 발생한다.
마) 멤버가 아닌 함수로 인자 받아서 사용하자.
: 멤버함수가 아닌 , 자체 구현된 begin() 과 end() 사용하면 문제 없음!
-> 배열도 처리할 수 있음.
원리에 대해 알아 보는 것임.
//일반함수 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종류가 있다.
컨테이너를 받는 begin 인데, 수정불가와 수정 가능한 함수 2개.
initialize_list를 인자로 받는 함수
일반 배열을 받는 방식.
end를 보면, Array 포인터에다가 마지막 인덱스를 가산하고 있는 것을 확인할 수 있다.