2015년 9월 12일 토요일
[C++11] begin, end
자료 구조를 순회하여 데이터에 접근하는 방법을 살펴보자.
Container 에 저장된 데이터에 접근하기 위해 대표적으로
Iterator의 begin(), end() function 을 사용한다.
하지만 위 예제에서 show() 함수에 배열이 전달된다면?
배열에는 는 container가 아니므로 begin(), end()를 제공할 iterator가 없어 error가 발생한다.
그렇다면 traits를 사용해서 전달되는 인자가 배열인지, container 인지 판별할 수 있지 않을까?
하지만 좀 더 생각해보면,
애시당초 배열에서도 begin(), end() 함수를 쓸 수 있도록 하면 되지 않을까?
container 의 멤버 함수를 이용하는 것이 아니라
template partial specialization을 이용해
배열, container 를 구분하여 begin(), end() 일반 함수를 제공하는 것이다.
결론적으로, 일반함수 begin(), end() 에 container, array type를 전달하여 호출하면 모두 사용할 수 있다!
하지만 이미 C++11 에 begin(), end()가 정의되어 있다!
좀 더 편한 방법은 없을까?
ranged-for 가 제일 편하다!!
그렇다면 ranged-for 하나로 되는 원리는 무엇일까?
위 예제에서 for(auto n : x) 코드는 컴파일 후 아래와 같이 변경된다.
결국엔 ranged-for 를 쓰나 일반함수 begin(), end() 를 쓰는 것이나 원리는 동일하다.
그렇다면 사용자 정의 class 에 ranged-for 를 사용하려면 어떻게 해야 하는가?
사용자 정의 class에는 begin(), end() 를 정의해야 ranged-for 를 사용할 수 있다.
피드 구독하기:
댓글 (Atom)
[C++] meta programing
재귀 호출에 관해 template meta programming 을 적용한 예제를 살펴보자. #include using namespace std; int fact(int n){ if(n factorial 연산을 하는 일반적인 재귀 호출 함...
-
Smart Pointer : 포인터처럼 동작하며 자동으로 메모리를 해제하고 안전하게 resource를 관리하도록 돕는 객체 포인터는 소멸자가 호출되지 않아 memory leak이 발생한다. Java, C#같은 VM이 있는 언어는 VM에서 G...
-
nullptr 란? C++11 에서 지원하는 null pointer 상수 먼저 pointer 가 초기화될 수 있는 정수 값을 살펴보자. 정수 0은 모든 타입의 포인터에 암시적 형변환을 통해서 초기화 값으로 사용될 수 있다. 하지만 그 이...
-
자료 구조를 순회하여 데이터에 접근하는 방법을 살펴보자. Container 에 저장된 데이터에 접근하기 위해 대표적으로 Iterator의 begin(), end() function 을 사용한다. 하지만 위 예제에서 show() 함수에 배열이...
댓글 없음:
댓글 쓰기