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>);
}