Namespaces
Variants

std:: iterator_traits

From cppreference.net
Iterator library
Iterator concepts
Iterator primitives
(deprecated in C++17)
iterator_traits


Algorithm concepts and utilities
Indirect callable concepts
Common algorithm requirements
(C++20)
(C++20)
(C++20)
Utilities
(C++20)
Iterator adaptors
Range access
(C++11) (C++14)
(C++14) (C++14)
(C++11) (C++14)
(C++14) (C++14)
(C++17) (C++20)
(C++17)
(C++17)
헤더 파일에 정의됨 <iterator>
template < class Iter >
struct iterator_traits ;
template < class T >
struct iterator_traits < T * > ;
template < class T >
struct iterator_traits < const T * > ;
(C++20에서 제거됨)

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 는 SFINAE-friendly입니다).

(C++17부터)
(C++20까지)

Iter pointer 를 가지고 있지 않지만 나머지 네 가지 중첩 타입을 모두 가지고 있다면, 이 네 가지 중첩 타입은 다음과 같이 선언됩니다:

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


그렇지 않고 Iter 가 설명 전용 개념 __LegacyInputIterator 을 만족한다면, 중첩 타입들은 다음과 같이 선언됩니다:

중첩 타입 정의
difference_type std:: incrementable_traits < Iter > :: difference_type
value_type std:: indirectly_readable_traits < Iter > :: value_type
pointer
  • Iter::pointer 가 유효한 경우.
  • 그렇지 않으면 decltype ( std:: declval < Iter & > ( ) . operator - > ( ) ) 가 유효한 경우.
  • 그렇지 않으면 void .
reference
iterator_category


그렇지 않고 Iter 가 설명 전용 개념 __LegacyIterator 을 만족한다면, 중첩 타입들은 다음과 같이 선언됩니다:

중첩 타입 정의
difference_type
value_type void
pointer void
reference void
iterator_category std::output_iterator_tag

그렇지 않다면, 이 템플릿은 해당 이름을 가진 멤버를 가지지 않습니다 ( std::iterator_traits 는 SFINAE-friendly입니다).

(C++20부터)

특수화

이 타입 특성은 반복자로 사용될 수 있는 사용자 제공 타입에 대해 특수화될 수 있습니다. 표준 라이브러리는 포인터 타입 T* 에 대해 부분 특수화를 제공하므로, 모든 반복자 기반 알고리즘을 raw 포인터와 함께 사용할 수 있습니다.

표준 라이브러리는 또한 일부 표준 반복자 어댑터에 대한 부분 특수화를 제공합니다.

(since C++20)

T* 특수화 중첩 타입

다음의 경우에만 특수화됨: std:: is_object_v < T > true 인 경우.

(since C++20)


중첩 타입 정의
difference_type std::ptrdiff_t
value_type T (C++20 이전) std:: remove_cv_t < T > (C++20 이후)
pointer T*
reference T&
iterator_category std::random_access_iterator_tag
iterator_concept (C++20 이후) std::contiguous_iterator_tag


const T * 특수화 중첩 타입

중첩 타입 정의
difference_type std::ptrdiff_t
value_type T
pointer const T *
reference const T &
iterator_category std::random_access_iterator_tag
(C++20 이전)

라이브러리 타입에 대한 특수화

std::common_iterator 타입의 속성에 대한 통일된 인터페이스를 제공함
(클래스 템플릿 특수화)
std::counted_iterator 타입의 속성에 대한 통일된 인터페이스를 제공함
(클래스 템플릿 특수화)

예제

양방향 반복자(bidirectional iterators)를 위한 범용 std:: reverse ( ) 구현을 보여줍니다.

#include <iostream>
#include <iterator>
#include <list>
#include <vector>
template<class BidirIt>
void my_reverse(BidirIt first, BidirIt last)
{
    typename std::iterator_traits<BidirIt>::difference_type n = std::distance(first, last);
    for (--n; n > 0; n -= 2)
    {
        typename std::iterator_traits<BidirIt>::value_type tmp = *first;
        *first++ = *--last;
        *last = tmp;
    }
}
int main()
{
    std::vector<int> v{1, 2, 3, 4, 5};
    my_reverse(v.begin(), v.end());
    for (int n : v)
        std::cout << n << ' ';
    std::cout << '\n';
    std::list<int> l{1, 2, 3, 4, 5};
    my_reverse(l.begin(), l.end());
    for (int n : l)
        std::cout << n << ' ';
    std::cout << '\n';
    int a[]{1, 2, 3, 4, 5};
    my_reverse(a, a + std::size(a));
    for (int n : a)
        std::cout << n << ' ';
    std::cout << '\n';
//  std::istreambuf_iterator<char> i1(std::cin), i2;
//  my_reverse(i1, i2); // 컴파일 오류: i1, i2는 입력 반복자(input iterators)입니다
}

출력:

5 4 3 2 1
5 4 3 2 1
5 4 3 2 1

참고 항목

(C++17에서 사용 중단됨)
단순 반복자에 필요한 타입 정의를 용이하게 하는 기본 클래스
(클래스 템플릿)
반복자 카테고리를 나타내는 데 사용되는 빈 클래스 타입들
(클래스)
반복자의 연관 타입들을 계산함
(앨리어스 템플릿)