这个打印代码是如何工作的
How does this printing code work?
我在某处找到了这段代码。它在屏幕上打印"abcd",但方式很奇怪。我想有人告诉我它是如何工作的:
#include <iostream>
#include <sstream>
class X
{
typedef std::istreambuf_iterator<char> Iter;
Iter it;
public:
X(std::streambuf* p) : it(p) { }
Iter begin()
{ return it; }
Iter end()
{ return Iter(); }
};
void printbuf(X x, std::ostreambuf_iterator<char> it)
{
for (auto c : x)
{
*it = c;
}
}
int main()
{
std::stringbuf buf("abcd", std::ios_base::in | std::ios_base::out);
printbuf(&buf, std::cout);
}
我们有一个类X
,它封装了一个istreambuf_iterator<char>
。这是一种迭代器类型,允许我们将流缓冲区视为标准算法的迭代器范围。
class X
{
typedef std::istreambuf_iterator<char> Iter;
Iter it;
public:
该类可以从指向流缓冲区实例的指针构造。
X(std::streambuf* p) : it(p) { }
它公开了begin()
和end()
成员函数,允许它与基于范围的for
循环一起使用。
Iter begin()
{ return it; }
Iter end()
{ return Iter(); }
};
printbuf()
是一个函数,它接受范围类X
的实例,以及ostreambuf_iterator<char>
,您猜对了,它允许我们使用输出流缓冲区作为输出迭代器。
void printbuf(X x, std::ostreambuf_iterator<char> it)
{
因此,我们对输入范围中的每个字符进行迭代。
for (auto c : x)
{
如果你以前没有处理过输出迭代器,你可以把它们想象成一个类似指针的对象,你可以使用解引用和赋值来写入值。back_insert_iterator
是一个常用的输出迭代器,用于构建容器——您通常使用back_inserter
来构建它。但我离题了。
我们将每个字符复制到输出迭代器。
*it = c;
}
}
int main()
{
这里我们构造了一个字符串缓冲区,它既是输入流缓冲区,也是输出流缓冲区。在本例中,我们仅使用输入功能。
std::stringbuf buf("abcd", std::ios_base::in | std::ios_base::out);
现在,我们使用隐式构造的X
实例将字符串缓冲区视为迭代器范围。然后,我们将该范围复制到输出流缓冲区迭代器(也是隐式构造的)std::cout
。
printbuf(&buf, std::cout);
}
其效果是,我们在缓冲区中的每个字符上循环,并将其复制到标准输出。
printbuf(&buf, std::cout);
传递std::stringbuf*
作为第一参数导致X
的隐式构造与printbuf()
匹配
对于第二个参数如果发生构造,则从std::cout
(std::ostream)创建std::ostreambuf_iterator<char>
的实例
void printbuf(X x, std::ostreambuf_iterator<char> it)
{
for (auto c : x)
{
*it = c;
}
}
在printbuf中,foreach循环(基于循环的范围)使用X::begin()
和X::end()
循环该包装的std::stringbuf
中的所有字符,并通过std::ostreambuf_iterator
(it
)将它们写入std::cout
- QSqlquery prepare()和bindvalue()不工作
- 导入库可以跨dll版本工作吗
- 以螺旋方式打印矩阵的程序.(工作不好)
- 对象指针在c++中是如何工作的
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- VSOMEIP-2个设备之间的通信(TCP/UDP)不工作
- 为字符串中每 N 个字符插入空格的函数没有按照我认为的方式工作?
- C++为线程工作动态地分割例程
- 为什么我的 std::ref 无法按预期工作?
- 布尔比较运算符是如何在C++中工作的
- SampleConsensusPrerejective(ext.RANSAC)是如何真正工作的
- 不确定要在我的main中放入什么才能使我的代码正常工作
- 为什么std::condition_variable notify_all的工作速度比notify_one快(对于随机请
- <<操作员在下面的行中工作
- 有人能解释一下为什么下界是这样工作的吗C++的
- ExtractIconEx:可以工作,但偶尔会崩溃
- C++中的memset函数工作不正常
- 当我在第一个循环中使用"auto"时,它工作正常,但是使用"int"它会给出错误,为什么?
- 当 int 方法工作正常时,void 方法有何不同,或者为什么我不能调用 void 方法?
- sdl软件渲染器不工作,工作在硬件加速的一个