以下是cppreference.com的一个示例:
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>() );
,我不太理解它在做什么..以及为什么可以通过使用cout<<&v[0]
输出字符串“Hello, world”。 - 为什么*i2的学徒值从“a”跳到“c”? 有人可以解释一下背后的机制吗?
非常感谢!
&v[0]
的呢? :) - David Gv[0]
是一个char
,所以&v[0]
是一个char*
。 - Jonathan Wakelychar*
只是其中一部分:代码通过手动添加'\0'
来进行小技巧。我想这就是为什么 0x499... 在评论旁边加了一个笑脸 :) - Sergey Kalinichenkoi2
在i1
递增后立即指向第二个字符。另外,下一段听起来好像i2
最初指向"a",但因为"b"已经被使用了,所以跳到了"c"。但实际上,在i1
递增之后(在i2
递增之前),i2
指向的是"b",你能详细解释一下吗? - starriet'\0'
的技巧的评论是正确的,但是即使没有v.push_back('\0');
,原始代码的输出结果仍然相同。这里发生了什么? - starriet