以下是来自 cppreference.com 的示例 http://en.cppreference.com/w/cpp/iterator/istreambuf_iterator,
The Code is:
#include <vector>
#include <sstream>
#include <iostream>
#include <iterator>
int main()
{
// typical use case: an input stream represented as a pair of iterators
std::istringstream in("Hello, world");
std::vector<char> v( (std::istreambuf_iterator<char>(in)),
std::istreambuf_iterator<char>() );
std::cout << "v has " << v.size() << " bytes. ";
v.push_back('\0');
std::cout << "it holds \"" << &v[0] << "\"\n";
// demonstration of the single-pass nature
std::istringstream s("abc");
std::istreambuf_iterator<char> i1(s), i2(s);
std::cout << "i1 returns " << *i1 << '\n'
<< "i2 returns " << *i2 << '\n';
++i1;
std::cout << "after incrementing i1, but not i2\n"
<< "i1 returns " << *i1 << '\n'
<< "i2 returns " << *i2 << '\n';
++i2; // this makes the apparent value of *i2 to jump from 'a' to 'c'
std::cout << "after incrementing i2, but not i1\n"
<< "i1 returns " << *i1 << '\n'
<< "i2 returns " << *i2 << '\n';
}
我有两个问题:
- 有人可以详细说明一下代码吗
std::vector<char> v( (std::istreambuf_iterator<char>(in)), std::istreambuf_iterator<char>() );
,我不太明白它在做什么......为什么我们可以通过使用打印字符串“Hello, world”cout<<&v[0]
- 为什么 *i2 的表观值从“a”跳到“c”?有人可以解释它的机制吗?
非常感谢!
有人可以详细说明一下代码吗...
std::vector<T>
有一个带有两个迭代器的构造函数<T>
- 一个用于范围的开始,一个用于范围的结束。
此构造函数从输入流创建输入流迭代器in
:
std::istreambuf_iterator<char>(in)
您可以继续访问其元素,直到到达流的末尾。一旦到达流的末尾,迭代器就相当于使用默认构造函数创建的迭代器:
std::istreambuf_iterator<char>()
因此,传递这对迭代器构造了一个vector<T>
从输入流读取的数据。整个流将被消耗。
为什么表观价值*i2
跳跃"a"
to "c"
?
两个迭代器都从同一个流中读取。当您增加第一个迭代器时,它会消耗'b'
来自底层流。同时,i2
指的是流的第一个字符,它在构造时没有前进就得到了。
一旦你增加i2
,它向流询问下一个字符。特点'b'
已经被消耗掉了,所以下一个字符是'c'
.
最后,代码引入了一个您可能忽略的小技巧:它将空终止符推入vector<char>
为了能够使用打印向量const char*
超载的operator <<(...)
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)