对“std::istreambuf_iterator”的使用感到困惑

2024-01-29

以下是来自 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';

}

我有两个问题:

  1. 有人可以详细说明一下代码吗std::vector<char> v( (std::istreambuf_iterator<char>(in)), std::istreambuf_iterator<char>() );,我不太明白它在做什么......为什么我们可以通过使用打印字符串“Hello, world”cout<<&v[0]
  2. 为什么 *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(使用前将#替换为@)

对“std::istreambuf_iterator”的使用感到困惑 的相关文章

随机推荐