std::istream_iterator
| 定义于头文件 <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 是一个单遍输入迭代器,它读取连续的 T 类型对象,这些对象来自构造时所关联的 std::basic_istream 对象,通过调用适当的 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 > |
|
成员类型
|
(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++标准。
| 缺陷报告 | 适用范围 | 发布时的行为 | 正确行为 |
|---|---|---|---|
| P0738R2 | C++98 | 首次读取操作可能延迟到首次解引用时执行 | 始终在构造函数中执行 |
参见
|
写入到
std::basic_ostream
的输出迭代器
(类模板) |
|
|
从
std::basic_streambuf
读取的输入迭代器
(类模板) |