std::istream_iterator
在标头 <iterator> 定义
|
||
template< class T, class CharT = char, |
(C++17 前) | |
template< class T, class CharT = char, |
(C++17 起) | |
std::istream_iterator
是单趟输入迭代器,从为之创建迭代器的 std::basic_istream 对象读取 T
类型的相继对象,通过调用适当的 operator>>
。实际读取操作在自增,而非解引用迭代器时进行。在构造迭代器时读取首个对象。解引用只返回最近读取的对象的副本。
默认构造的 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> |
要求通过从 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 更有效率,因为它避免对每个字符构造并析构一次 sentry 对象的开销。
示例
#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 << "\n第一个偶数是 " << *it << "。\n"; // " 9 10" 留在流中 }
输出:
0.1 0.3 0.6 1 第一个偶数是 8。
缺陷报告
下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。
缺陷报告 | 应用于 | 出版时的行为 | 正确行为 |
---|---|---|---|
P0738R2 | C++98 | 首次读取可以延迟到首次解引用 | 一定会在构造函数中进行 |
参阅
写入 std::basic_ostream 的输出迭代器 (类模板) | |
从 std::basic_streambuf 读取的输入迭代器 (类模板) |