std:: iterator_traits
|
헤더 파일에 정의됨
<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를 제공하지 않더라도 반복자에 대한 정보를 검색할 수 있습니다.
|
사용자 특수화는
반복자 범주 태그
중 하나로 중첩 타입
|
(C++20부터) |
목차 |
템플릿 매개변수
| Iter | - | 속성을 검색하기 위한 반복자 유형 |
멤버 타입
| 중첩 타입 | 정의 |
difference_type
|
Iter::difference_type
|
value_type
|
Iter::value_type
|
pointer
|
Iter::pointer
|
reference
|
Iter::reference
|
iterator_category
|
Iter::iterator_category
|
|
|
(C++17부터)
(C++20까지) |
||||||||||||||||||||||||||||||||||||
|
그렇지 않다면, 이 템플릿은 해당 이름을 가진 멤버를 가지지 않습니다
(
|
(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 * 특수화 중첩 타입
|
(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에서 사용 중단됨)
|
단순 반복자에 필요한 타입 정의를 용이하게 하는 기본 클래스
(클래스 템플릿) |
|
반복자 카테고리를 나타내는 데 사용되는 빈 클래스 타입들
(클래스) |
|
|
(C++20)
(C++20)
(C++23)
(C++20)
(C++20)
(C++20)
|
반복자의 연관 타입들을 계산함
(앨리어스 템플릿) |