std::istreambuf_iterator
在标头 <iterator> 定义
|
||
template< class CharT, class Traits = std::char_traits<CharT> > class istreambuf_iterator : |
(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
抵达底层流结尾时,它变得等于流尾迭代器。解引用或进一步自增它导致未定义行为。
|
(C++11 起) |
成员类型
成员类型 | 定义 |
iterator_category
|
std::input_iterator_tag |
value_type
|
CharT |
difference_type
|
typename Traits::off_type |
pointer
|
/* 未指定*/ |
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> |
/* 代理 */ | 由实现定义的类类型。名称 代理 只用于说明。代理 对象保有一个 char_type 字符和一个 streambuf_type* 指针。以 operator* 解引用 代理 对象得到存储的字符。
|
要求通过从 std::iterator<std::input_iterator_tag, CharT, typename Traits::off_type, /* 未指定*/, CharT> 继承获得成员类型 |
(C++17 前) |
成员类型 pointer
通常是 CharT*
(见下文)。
成员函数
构造新的 istreambuf_iterator (公开成员函数) | |
(析构函数) (隐式声明) |
析构 istreambuf_iterator (公开成员函数) |
获得当前字符的副本 (公开成员函数) | |
推进迭代器 (公开成员函数) | |
测试两个 istreambuf_iterator 是否均为流尾或均合法 (公开成员函数) |
非成员函数
(C++20 中移除) |
比较两个 istreambuf_iterator (函数模板) |
注解
LWG 问题 659 的解决方案引入了 operator->。在给定 std::istreambuf_iterator
i 的情况下,期待表达式 (*i).m 和 i->m 具有相同的效果。
然而该解决方案并没有正式描述它的行为。因此它有多种实现:包括返回 nullptr,返回临时量的地址,甚至直接不实现该成员。这导致它的期待行为难以达成,并且后来通过 LWG 问题 2790 的解决方案将它移除。
LWG 问题 659 的解决方案同时不再指定成员类型 pointer
,这是为了能让 operator-> 返回代理。这样在 CharT
不是类类型时 operator-> 也能成功编译。
示例
#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 拥有 " << ss.size() << " 个字节;" "它持有 \"" << ss << "\"\n"; // 演示单趟本质 std::istringstream s{"abc"}; std::istreambuf_iterator<char> i1{s}, i2{s}; std::cout << "i1 返回 '" << *i1 << "'\n" "i2 返回 '" << *i2 << "'\n"; ++i1; std::cout << "在只自增 i1 但不自增 i2 后:\n" "i1 返回 '" << *i1 << "'\n" "i2 返回 '" << *i2 << "'\n"; ++i2; std::cout << "在只自增 i2 但不自增 i1 后:\n" "i1 返回 '" << *i1 << "'\n" "i2 返回 '" << *i2 << "'\n"; }
输出:
ss 拥有 12 个字节;它持有 "Hello, world" i1 返回 'a' i2 返回 'a' 在只自增 i1 但不自增 i2 后: i1 返回 'b' i2 返回 'b' 在只自增 i2 但不自增 i1 后: i1 返回 'c' i2 返回 'c'
缺陷报告
下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。
缺陷报告 | 应用于 | 出版时的行为 | 正确行为 |
---|---|---|---|
LWG 659 | C++98 | 1. std::istreambuf_iterator 没有 operator->2. 成员类型 pointer 被指定为 CharT*
|
1. 已添加 2. 不再指定 |
LWG 2790 | C++98 | 由 LWG 问题 659 添加的 operator-> 没有用处 | 已移除 |
参阅
写入 std::basic_streambuf 的输出迭代器 (类模板) | |
从 std::basic_istream 读取的输入迭代器 (类模板) |