命名空间
变体
操作

std::istream_iterator

来自 cppreference.com
< cpp‎ | iterator
 
 
迭代器库
迭代器概念
迭代器原语
(在 C++17 中已弃用)


算法概念和实用程序
间接可调用概念
通用算法需求
(C++20)
(C++20)
(C++20)
实用程序
(C++20)
迭代器适配器
范围访问
(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 T,

          class CharT = char,
          class Traits = std::char_traits<CharT>,
          class Distance = std::ptrdiff_t >
class istream_iterator

    : public std::iterator<std::input_iterator_tag, T, Distance, const T*, const T&>
(直到 C++17)
template< class T,

          class CharT = char,
          class Traits = std::char_traits<CharT>,
          class Distance = std::ptrdiff_t >

class istream_iterator;
(自 C++17 起)

std::istream_iterator 是一个单次通过输入迭代器,它通过调用相应的 operator>> 从它被构造的 std::basic_istream 对象读取类型为 T 的连续对象。实际读取操作是在迭代器递增时执行的,而不是在解引用时执行的。第一个对象是在构造迭代器时读取的。解引用只返回最近读取对象的副本。

默认构造的 std::istream_iterator 被称为流结束迭代器。当一个有效的 std::istream_iterator 达到底层流的末尾时,它将变为等于流结束迭代器。进一步解引用或递增它将导致未定义的行为。即使底层流改变状态,流结束迭代器也会保持在流结束状态。在没有重新赋值的情况下,它不能再变为非流结束迭代器。

std::istream_iterator 的典型实现包含两个数据成员:一个指向关联的 std::basic_istream 对象的指针,以及最近读取的类型为 T 的值。

T 必须满足 DefaultConstructibleCopyConstructibleCopyAssignable 要求。

内容

[编辑] 成员类型

成员类型 定义
iterator_category std::input_iterator_tag
value_type T
difference_type Distance
pointer const T*
reference const T&
char_type CharT
traits_type Traits
istream_type std::basic_istream<CharT, Traits>

成员类型 iterator_categoryvalue_typedifference_typepointerreference 要求通过继承自 std::iterator<std::input_iterator_tag, T, Distance, const T*, const T&> 来获取。

(直到 C++17)

[编辑] 成员函数

构造一个新的 istream_iterator
(公共成员函数) [编辑]
析构一个 istream_iterator,包括缓存的值
(公共成员函数) [编辑]
返回当前元素
(公共成员函数) [编辑]
递增迭代器
(公共成员函数) [编辑]

[编辑] 非成员函数

(在 C++20 中已移除)
比较两个 istream_iterator
(函数模板) [编辑]

[编辑] 注释

当读取字符时,std::istream_iterator 默认会跳过空白字符(除非使用 std::noskipws 或等效操作禁用),而 std::istreambuf_iterator 则不会。此外,std::istreambuf_iterator 更有效率,因为它避免了为每个字符构建和销毁哨兵对象带来的开销。

[编辑] 示例

#include <algorithm>
#include <iostream>
#include <iterator>
#include <numeric>
#include <sstream>
 
int main()
{
    std::istringstream str("0.1 0.2 0.3 0.4");
    std::partial_sum(std::istream_iterator<double>(str),
                     std::istream_iterator<double>(),
                     std::ostream_iterator<double>(std::cout, " "));
 
    std::istringstream str2("1 3 5 7 8 9 10");
    auto it = std::find_if(std::istream_iterator<int>(str2),
                           std::istream_iterator<int>(),
                           [](int i){ return i % 2 == 0; });
 
    if (it != std::istream_iterator<int>())
        std::cout << "\nThe first even number is " << *it << ".\n";
    //" 9 10" left in the stream
}

输出

0.1 0.3 0.6 1 
The first even number is 8.

[编辑] 缺陷报告

以下行为变更缺陷报告被追溯应用于之前发布的 C++ 标准。

DR 应用于 已发布的行为 正确行为
P0738R2 C++98 第一次读取可能被推迟到第一次解引用 始终在构造函数中执行

[编辑] 另请参阅

写入 std::basic_ostream 的输出迭代器
(类模板) [编辑]
std::basic_streambuf 读取的输入迭代器
(类模板) [编辑]