'C++' std::iterator_traits

토스트·2025년 5월 15일

'C++' std::iterator

목록 보기
1/3

iterator_traits

임의의 반복자 타입에서 필요한 타입 정보를 추출해서 알고리즘에서 일반화된 방법으로 반복자를 다룰 수 있게 도와줍니다.

struct iterator_traits {
   typedef typename Iterator::iterator_category iterator_category;
   typedef typename Iterator::value_type value_type;
   typedef typename Iterator::difference_type difference_type;
   typedef difference_type distance_type;
   typedef typename Iterator::pointer pointer;
   typedef typename Iterator::reference reference;
};

iterator_category : 반복자의 카테고리를 추출합니다.

<예시>

#include <iostream>
#include <vector>
#include <list>
#include <iterator>

int main() {
    std::cout << "vector: " << typeid(std::vector<int>::iterator::iterator_category).name() << std::endl;
    std::cout << "list: " << typeid(std::list<int>::iterator::iterator_category).name();

    return 0;
}

결과

value_type : 반복자가 가리키는 값의 타입을 추출합니다.

<예시>

#include <iostream>
#include <vector>
#include <iterator>

int main() {
    std::cout << "value_type: " << typeid(std::vector<int>::iterator::value_type).name() << std::endl;

    return 0;
}

결과

difference_type : 두 반복자 간의 거리 타입을 제공합니다. (ptrdiff_t)

distance_type : 표준에서 제외된 difference_type의 별칭

<예시>

#include <iostream>
#include <vector>
#include <iterator>

int main() {
    std::vector<int> vec = { 1, 2, 3, 4 };

    std::vector<int>::iterator it1 = vec.begin();
    std::vector<int>::iterator it2 = vec.end();

    std::vector<int>::iterator::difference_type diff = it2 - it1;

    std::cout << diff;

    return 0;
}

결과

pointer : 반복자가 가리키는 타입의 포인터 타입을 추출합니다.
reference : 반복자가 가리키는 타입의 레퍼런스 타입을 추출합니다.

<예시>

#include <iostream>
#include <vector>
#include <iterator>
#include <type_traits> // is_same

int main() {
    std::vector<int> vec = { 1, 2, 3 };

    std::vector<int>::iterator it = vec.begin();

    std::iterator_traits<std::vector<int>::iterator>::pointer p = &(*it);
    std::iterator_traits<std::vector<int>::iterator>::reference r = *it;

    std::cout << typeid(p).name() << '\n';
    std::cout << std::is_same<int&, decltype(r)>::value; 
    // 두 타입이 같으면 true, 다르면 false를 출력하는 템플릿 구조체

    return 0;
}

결과

0개의 댓글