달력

5

« 2024/5 »

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
2012. 9. 28. 19:47

c++ 특성정보 c++2012. 9. 28. 19:47

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
:
Posted by НooпeУ


Code Start Code End