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 为某个 迭代器类别标签 ,以表明符合迭代器概念的要求。

(since 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 友好)。

(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 友好)。

(C++20 起)

特化

此类型特征可针对可能用作迭代器的用户提供类型进行特化。标准库为指针类型 T* 提供了部分特化,这使得所有基于迭代器的算法都能与原始指针一起使用。

标准库还为部分标准迭代器适配器提供了偏特化版本。

(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 类型的属性提供统一接口
(类模板特化)

示例

展示了一个用于双向迭代器的通用 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); // compilation error: i1, i2 are input iterators
}

输出:

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

参见

(C++17 中弃用)
用于简化简单迭代器必需类型定义的基类
(类模板)
用于指示迭代器类别的空类类型
(类)
计算迭代器的关联类型
(别名模板)