std::iterator_traits

std::iterator_traits (반복자 특성)

LegacyIterator 타입의 속성에 통일된 인터페이스를 제공하는 타입 특성 클래스예요. 알고리즘을 반복자만으로 구현할 수 있게 해줘요.

출처: cppreference

본문

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

template< class Iter >
struct iterator_traits;

template< class T >
struct iterator_traits<T*>;

template< class T >
struct iterator_traits<const T*>;

std::iterator_traits는 LegacyIterator 타입의 속성에 통일된 인터페이스를 제공하는 타입 특성 클래스예요. 이 덕분에 알고리즘을 반복자만으로 구현할 수 있어요. 사용자 정의 반복자를 위해 특수화할 수 있어, 타입이 일반적인 typedef를 제공하지 않아도 반복자 정보를 얻을 수 있어요. 사용자 특수화는 반복자 컨셉 준수를 나타내기 위해 중첩 타입 iterator_concept을 반복자 카테고리 태그 중 하나로 정의할 수 있어요(C++20부터).

템플릿 매개변수

  • Iter — 속성을 얻을 반복자 타입

멤버 타입

중첩 타입 정의
difference_type Iter::difference_type
value_type Iter::value_type
pointer Iter::pointer
reference Iter::reference
iterator_category Iter::iterator_category

Iter이 다섯 타입 중 어떤 것도 가지지 않으면, std::iterator_traits의 해당 멤버 타입은 iterator_traits의 기본 정의 규칙(예: *Iter이 참조 가능한 경우 등)에 따라 결정되지 않을 수 있어요. 포인터에 대한 특수화는 포인터 타입에 알맞은 멤버 타입을 제공해요.

예제

#include <iterator>
#include <vector>
#include <type_traits>

int main()
{
    using It = std::vector<int>::iterator;
    static_assert(std::is_same_v<std::iterator_traits<It>::value_type, int>);
    static_assert(std::is_same_v<std::iterator_traits<It>::iterator_category,
                                 std::random_access_iterator_tag>);
}

더 알아보기 (Learn more)

cppreference