std::iterator_tags

std::iterator_tags (반복자 카테고리 태그)

반복자의 카테고리를 정의하는 빈 태그 타입들이에요. 각 태그는 빈 타입이에요. contiguous_iterator_tag는 C++20부터 추가됐어요.

출처: cppreference

본문

<iterator> 헤더에 정의돼 있어요.

// (1)
struct input_iterator_tag {};

// (2)
struct output_iterator_tag {};

// (3)
struct forward_iterator_tag : public input_iterator_tag {};

// (4)
struct bidirectional_iterator_tag : public forward_iterator_tag {};

// (5)
struct random_access_iterator_tag : public bidirectional_iterator_tag {};

// (6) C++20
struct contiguous_iterator_tag : public random_access_iterator_tag {};

반복자의 카테고리를 정의해요. 각 태그는 빈 타입이에요.

반복자 카테고리

모든 LegacyIterator 타입 It에 대해, It이 속한 가장 구체적인 카테고리를 나타내도록 std::iterator_traits<It>::iterator_category typedef가 이 태그 타입 중 하나의 별칭으로 정의돼야 해요.

  • input_iterator_tag — LegacyInputIterator에 대응.
  • output_iterator_tag — LegacyOutputIterator에 대응.
  • forward_iterator_tag — LegacyForwardIterator에 대응.
  • bidirectional_iterator_tag — LegacyBidirectionalIterator에 대응.
  • random_access_iterator_tag — LegacyRandomAccessIterator에 대응.
  • contiguous_iterator_tag — LegacyContiguousIterator에 대응(C++20).

태그들은 상속으로 계층을 이뤄서, 더 구체적인 반복자는 더 일반적인 반복자의 요구사항도 만족함을 나타내요.

예제

#include <iterator>
#include <vector>

int main()
{
    // std::iterator_traits<std::vector<int>::iterator>::iterator_category 는
    // std::random_access_iterator_tag
    static_assert(std::derived_from<
        std::iterator_traits<std::vector<int>::iterator>::iterator_category,
        std::forward_iterator_tag>);
}

더 알아보기 (Learn more)

cppreference