# std::istreambuf_iterator

< cpp‎ | iterator

定义于头文件 `<iterator>` |  |
template< class CharT, class Traits = std::char_traits<CharT> > class istreambuf_iterator : public std::iterator< std::input_iterator_tag, CharT, typename Traits::off_type, /* unspecified, usually CharT* */, CharT > |  | (C++17 前)
template< class CharT, class Traits = std::char_traits<CharT> > class istreambuf_iterator; |  | (C++17 起)

`std::istreambuf_iterator` 是单趟迭代器，从为之构造迭代器的 std::basic_streambuf 对象读取相继字符。

默认构造的 `std::istreambuf_iterator` 迭代器被称为流尾迭代器。合法的 `std::istreambuf_iterator` 抵达底层流结尾时，它变得等于流尾迭代器。解引用或进一步自增它导致未定义行为。

`std::istreambuf_iterator` 拥有平凡复制构造函数、 constexpr 默认构造函数和平凡析构函数。 | (C++11 起)

### 成员类型

成员类型 | 定义
`iterator_category` | std::input_iterator_tag
`value_type` | CharT
`difference_type` | Traits::off_type
`pointer` | /* unspecified, usually CharT* */
`reference` | CharT
`char_type` | `CharT`
`traits_type` | `Traits`
`int_type` | typename traits::int_type
`streambuf_type` | std::basic_streambuf<CharT, Traits>
`istream_type` | std::basic_istream<CharT, Traits>
/* proxy */ | 实现定义的类类型。名称 `proxy` 仅为说明。 `proxy` 对象保有一个 `char_type` 字符和一个 `streambuf_type*` 指针。 以 `operator*` 解引用 `proxy` 对象得到存储的字符。

要求通过从 std::iterator<std::input_iterator_tag, CharT, Traits::off_type, /* unspecified, usually CharT* */, CharT> 继承获得成员类型 `iterator_category`、 `value_type`、 `difference_type`、 `pointer` 及 `reference` 。 | (C++17 前)

### 成员函数

(构造函数) | 构造新的 `istreambuf_iterator` (公开成员函数)
(析构函数) (隐式声明) | 析构 `istreambuf_iterator` (公开成员函数)
operator*operator-> (C++11 起)(C++17 前) | 获得当前字符的副本 若 `CharT` 拥有成员，则访问当前字符的成员 (公开成员函数)
operator++operator++(int) | 推进迭代器 (公开成员函数)
equal | 测试两个 `istreambuf_iterator` 是否均为流尾或均合法 (公开成员函数)

### 非成员函数

operator==operator!= (C++20 中移除) | 比较两个 `istreambuf_iterator` (函数模板)

### 示例

    #include <string>
    #include <sstream>
    #include <iostream>
    #include <iterator>

    int main()
    {
        // 典型使用情况：以一对迭代器表示的输入流
        std::istringstream in{"Hello, world"};
        std::istreambuf_iterator<char> it{in}, end;
        std::string ss{it, end};
        std::cout << "ss has " << ss.size() << " bytes; "
                     "it holds \"" << ss << "\"\n";

        // 演示单趟本性
        std::istringstream s{"abc"};
        std::istreambuf_iterator<char> i1{s}, i2{s};
        std::cout << "i1 returns '" << *i1 << "'\n"
                     "i2 returns '" << *i2 << "'\n";
        ++i1;
        std::cout << "after incrementing i1, but not i2\n"
                     "i1 returns '" << *i1 << "'\n"
                     "i2 returns '" << *i2 << "'\n";
        ++i2;
        std::cout << "after incrementing i2, but not i1\n"
                     "i1 returns '" << *i1 << "'\n"
                     "i2 returns '" << *i2 << "'\n";
    }

输出：

    ss has 12 bytes; it holds "Hello, world"
    i1 returns 'a'
    i2 returns 'a'
    after incrementing i1, but not i2
    i1 returns 'b'
    i2 returns 'b'
    after incrementing i2, but not i1
    i1 returns 'c'
    i2 returns 'c'

### 参阅

ostreambuf_iterator | 写入 std::basic_streambuf 的输出迭代器 (类模板)
istream_iterator | 从 std::basic_istream 读取的输入迭代器 (类模板)