C++ STL中,为何copy函数会直接cout到屏幕上?
ostream_iterator<int,char>pp(cout,"");copy(one.begin(),one.end(),pp);就是把STL的链表内容复制到输出...
ostream_iterator<int,char>pp(cout," ");
copy(one.begin(),one.end(),pp);
就是把STL的链表内容复制到输出流中。
但是,输出流应该是一个缓冲区啊。怎么没有cout<<他就能直接输出了呢?
有人说
调用copy所做的相当于
for (list<int>::iterator a = one.begin(); a != one.end(); a++)
*++pp = *a;
再由于*++pp = a;等价于cout << a << " ";以上代码又可以转化成
for (list<int>::iterator a = one.begin(); a != one.end(); a++)
cout << *a << " ";
但是我就不懂了,*++pp = a;怎么会等价于cout << a << " " ??? 展开
copy(one.begin(),one.end(),pp);
就是把STL的链表内容复制到输出流中。
但是,输出流应该是一个缓冲区啊。怎么没有cout<<他就能直接输出了呢?
有人说
调用copy所做的相当于
for (list<int>::iterator a = one.begin(); a != one.end(); a++)
*++pp = *a;
再由于*++pp = a;等价于cout << a << " ";以上代码又可以转化成
for (list<int>::iterator a = one.begin(); a != one.end(); a++)
cout << *a << " ";
但是我就不懂了,*++pp = a;怎么会等价于cout << a << " " ??? 展开
1个回答
展开全部
因为ostream_iterator重载了 = 运算符 和 * 运算符, 和++运算符.
*++pp = a; 等价于以下3步:
++pp; // 重载的++, 什么都不做, 直接忽略
*pp; // 重载的*, 什么都不做, 直接忽略, 还是返回pp自己
pp = a; // 重载的=, 调用了 cout << a << " "; , 其中后面的空格是定义pp的第二个参数.
因而最后,
*++pp = a; 就等价于 cout << a << " ";
*++pp = a; 等价于以下3步:
++pp; // 重载的++, 什么都不做, 直接忽略
*pp; // 重载的*, 什么都不做, 直接忽略, 还是返回pp自己
pp = a; // 重载的=, 调用了 cout << a << " "; , 其中后面的空格是定义pp的第二个参数.
因而最后,
*++pp = a; 就等价于 cout << a << " ";
更多追问追答
追问
这不太对啊,这是copy函数啊,是复制啊,按照你的说法,哪里来的复制?
结果不就成了cout<<输出了么,哪里来的复制?
追答
*++pp = a;
这个 = 就是复制,
但是ostream_iterator重载了=, 转成了 <<
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询