2011-08-16 5 views
0

맞춤 반복기 유형을 만들고 있는데, 현재 유일한 유스 케이스는 std::for_each입니다. 하지만 분명히 포인터 인터페이스를 모방하는 것만으로는 충분하지 않습니다. (전진 반복 만하고 있습니다.) bajillion 중첩 된 typedef가 있습니다. 나는 iterator_category에 무엇을 넣어야하는지 알아낼 수 있었지만 실제로는 value_typepointerreference이 무엇인지 알아내는 데 어려움을 겪고 있습니다. 여기 컨테이너를 만들지 않으므로 iterator입니다. 왜 for_each도 알아 두거나 신경 써야할까요? 앞으로 할 일은 앞으로 다른 기능에 대해 말한 것입니다.반복자 중첩 된 typedef

+0

[부스트 반복기 외관] (http://www.boost.org/doc/libs/1_47_0/libs/iterator/doc/index.html#iterator-facade-and-adaptor)을 사용해보십시오. 반복자 작성을 더 쉽게 만들어야합니다. –

답변

1

유형 T을 반복자로 사용하려면 std::iterator_traits을 해당 유형에 대해 특수화 할 수 있어야합니다. 즉, 기본적으로 사용되는 다섯 개의 중첩 된 typedef를 제공해야하거나 직접 std::iterator_traits을 전문화해야합니다. 이 요구 다섯 중첩 형식 정의는 (std::distance 의해 반환되는 바와 같이, 예) 개의 반복기 사이의 거리를 나타낼 수있는 몇 가지 유형

  • VALUE_TYPE를이다

    • difference_type, 어느 반복기가 가리키는 객체의 유형입니다.

    • 포인터은 반복기 유형의 반환 유형입니다. operator->. 반드시 포인터 유형 일 필요는 없으며 반드시 value_type* 또는 value_type const* 일 필요는 없습니다. 예를 들어, 요소를 생성하는 반복자가있는 경우 포인터를 반환 할 수있는 객체가 없을 수 있습니다. 이 경우 반환 된 요소를 래핑하는 객체를 반환하고 operator-> 자체에 오버로드 할 수 있습니다.

    • 참조으로, 이터레이터 유형의 operator*의 리턴 유형입니다. 반드시 참조 유형 일 필요는 없으며 반드시 value_type& (또는 value_type const&) 일 필요는 없습니다. 예를 들어, 변경할 수없는 정수 범위를 반복하는 경우 성능상의 이유로 요소를 값으로 반환 할 수 있습니다. 반복자 카테고리 태그 또는 그 태그 중 하나에서 파생 된 유형 중 하나 여야합니다 iterator_category

    • : input_iterator_tag, output_iterator_tag, forward_iterator_tag, bidirectional_iterator_tagrandom_access_iterator_tag (네임 스페이스 std의 모든). 알고리즘은 이것을 사용하여 반복자 범주에 따라 최적의 알고리즘을 선택할 수 있습니다.

    이 중 일부를 생략 할 수 없습니다. 그들 모두는 정의되어야한다. 즉, 때로는 하나 이상의 typedef가 의미가 없을 수도 있습니다. 예를 들어, char 요소를 즉석에서 생성하는 반복기가있는 경우 반복자는 operator->을 구현하지 못할 수 있습니다 (char은 클래스 유형이 아니기 때문에). 이 경우 어쨌든 사용해서는 안되기 때문에 pointer 유형의 경우에만 void을 사용하는 것이 좋습니다.

  • 0

    value_type 이터레이터가 반복합니다. iter이 반복자이면 *iter 유형입니다. pointer이 그것에 대한 포인터이며 reference이 이에 대한 참조입니다.