# std::iterator

< cpp‎ | iterator

定义于头文件 `<iterator>` |  |
template< class Category, class T, class Distance = std::ptrdiff_t, class Pointer = T*, class Reference = T& > struct iterator; |  | (C++17 中弃用)

`std::iterator` 是提供以简化迭代器所要求类型定义的基类。

### 模板形参

Category | - | 迭代器类别。必须是迭代器类别标签之一。
T | - | 能通过解引用迭代器获得的值的类型。此类型对于输出迭代器应为 `void` 。
Distance | - | 能用于标识迭代器间距离的类型
Pointer | - | 定义指向被迭代的类型（ `T` ）的指针
Reference | - | 定义到被迭代的类型（ `T` ）的引用

### 成员类型

成员类型 | 定义
`iterator_category` | `Category`
`value_type` | `T`
`difference_type` | `Distance`
`pointer` | `Pointer`
`reference` | `Reference`

### 示例

以下示例演示如何通过继承 `std::iterator` 实现输入迭代器

    #include <iostream>
    #include <algorithm>

    template<long FROM, long TO>
    class Range {
    public:
        // 通过继承自 std::iterator 提供成员 typedef
        class iterator: public std::iterator<
                            std::input_iterator_tag,   // iterator_category
                            long,                      // value_type
                            long,                      // difference_type
                            const long*,               // pointer
                            long                       // reference
                                          >{
            long num = FROM;
        public:
            explicit iterator(long _num = 0) : num(_num) {}
            iterator& operator++() {num = TO >= FROM ? num + 1: num - 1; return *this;}
            iterator operator++(int) {iterator retval = *this; ++(*this); return retval;}
            bool operator==(iterator other) const {return num == other.num;}
            bool operator!=(iterator other) const {return !(*this == other);}
            reference operator*() const {return num;}
        };
        iterator begin() {return iterator(FROM);}
        iterator end() {return iterator(TO >= FROM? TO+1 : TO-1);}
    };

    int main() {
        // std::find 要求输入迭代器
        auto range = Range<15, 25>();
        auto itr = std::find(range.begin(), range.end(), 18);
        std::cout << *itr << '\n'; // 18

        // Range::iterator 亦满足基于范围的 for 要求
        for(long l : Range<3, 5>()) {
            std::cout << l << ' '; // 3 4 5
        }
        std::cout << '\n';
    }

输出：

    18
    3 4 5

### 参阅

iterator_traits | 为迭代器各项性质提供统一接口 (类模板)
input_iterator_tag output_iterator_tag forward_iterator_tag bidirectional_iterator_tag random_access_iterator_tag contiguous_iterator_tag (C++20) | 用于指示迭代器类别的空类类型 (类)