iterator_category에는 다섯가지의 종류가 있다.
출력 반복자 : 쓰기만 가능, 한번만 access
입력 반복자: 읽기만 가능, 한번만 access
순방향 반복자 : 쓰기 , 읽기, 여러번 , slist 자료구조
양방향 반복자 : 순방향 반복자에 뒤로가기 기능 추가, set, multiset, map, multimap 추가
임의 접근 반복자: 양방향 반복자에 반복자 산술 연산 기능 추가 , 반복자를 임의의 거리만큼 상수시간에 가능
vector, deque, string 자료구조 배열로구현
---------------------------------------------------------------------------------------------------------------
특성 정보(traits) : 컴파일 더증에 어떤 주어진 타입의 정보를 얻을 수 있게 하는 개체를 지칭하는 개념
template<typename IterT, typename DistT>
void advance(IterT& iter, DistT d)
{
if(iter
}
template<typename IterT>
struct iteratro_traits;
class iterator{
public:
typedef random_access_iterator_tag iterator_category;
}
template<typename iterT>
class list{
public:
typedef bidirectional_iterator_tag iterator_tag;
}
부분 템플릿 특수화를 진행
template<typename IterT>
struct iterator_traits<IterT *>{
typedef random_access_iterator_tag iterator_category;
};
따라서 다음과 같이 advance를 구현한다.
template<typename IterT, typename distT>
void advance(IterT& iter, DistT d)
{
if(typeid(typename std::iterator_traits<IterT>::iteraotr_category) == typeid(std::ramdom_access_iterator_tag))
}
* typeid는 런타임에 type정보를 얻게다는 의미
typeid는 특성정보를 쓴느 방법보다 효율이 떨어짐
1. 컴파일 타임에 아는 것이 아니라, 런타임에 알기 때문
2. 런타임 타입 점검을 수행하는 코드는 어쩔 수 없이 실행파일에 들어감
* if는 런타임중에 비교를 하고, iterator_traits<IterT>::iterator_category를 파악할 수 있는 단계는 컴파일타임중이다.
iterator_traits<IterT>는 IterT 타입 매개변수의 iterator_traits(타입정보)를 얻어와서 iterator_category 즉, 어떤 iterator를 사용하는지를 리턴하는 것이다.
그러므로 , 위 코드는 비효율적이다.
오버로딩을 이용하여 해결, 컴파일러는 가장 적합한 오버로드 버전을 골라냄
template<typename IterT, typename DistT>
void doAdvance(IterT& iter, DistT& d, std::random_access_iterator_tag)
template<typename IterT, typename DistT>
void doAdvance(IterT& iter, DistT& d, std::bidirectional_access_iterator_tag)
template<typename IterT, typename DistT>
void doAdvance(IterT& iter, DistT& d, std::input_access_iterator_tag)
***
template<typename IterT, typename DistT>
void advance(IterT& iter, DistT d)
{
doAdvance(iter, d, typename std::iterator_traits<IterT>::iterator_category());
}
*내생각 : std::iterator_traits<IterT>::iterator_category() 를 호출하면 iterT 클래스가 가지고 있는 iterator_category()를 리턴하고 그에 적합한 오버로딩 함수가 호출됨
'c++' 카테고리의 다른 글
c++ static 변수 선언 및 정의 (0) | 2012.11.28 |
---|---|
c++ operator new (0) | 2012.10.01 |
template C++ (0) | 2012.09.27 |
c++ quiz4 (0) | 2012.09.27 |
c++ quiz3 (0) | 2012.09.27 |