std::istream_iterator
定义在头文件 <iterator> 中 |
||
template< class T, class CharT = char, |
(直到 C++17) | |
template< class T, class CharT = char, |
(自 C++17 起) | |
std::istream_iterator
是一个单次通过输入迭代器,它通过调用相应的 operator>> 从它被构造的 std::basic_istream 对象读取类型为 T
的连续对象。实际读取操作是在迭代器递增时执行的,而不是在解引用时执行的。第一个对象是在构造迭代器时读取的。解引用只返回最近读取对象的副本。
默认构造的 std::istream_iterator
被称为流结束迭代器。当一个有效的 std::istream_iterator
达到底层流的末尾时,它将变为等于流结束迭代器。进一步解引用或递增它将导致未定义的行为。即使底层流改变状态,流结束迭代器也会保持在流结束状态。在没有重新赋值的情况下,它不能再变为非流结束迭代器。
std::istream_iterator
的典型实现包含两个数据成员:一个指向关联的 std::basic_istream 对象的指针,以及最近读取的类型为 T
的值。
T
必须满足 DefaultConstructible、CopyConstructible 和 CopyAssignable 要求。
内容 |
[编辑] 成员类型
成员类型 | 定义 |
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> |
成员类型 |
(直到 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 读取的输入迭代器 (类模板) |