C++ C++;直接将cin复制到cout中,但顺序相反
此命令是否有类似的解决方案:C++ C++;直接将cin复制到cout中,但顺序相反,c++,algorithm,iterator,reverse,C++,Algorithm,Iterator,Reverse,此命令是否有类似的解决方案: using namespace std; copy(istream_iterator<string>(cin), istream_iterator<string>(),ostream_iterator<string>(cout, "\n")); 使用名称空间std; 复制(istream_迭代器(cin)、istream_迭代器()、ostream_迭代器(cout,“\n”)); --此命令将所有内容复制到cout中,但我希
using namespace std;
copy(istream_iterator<string>(cin), istream_iterator<string>(),ostream_iterator<string>(cout, "\n"));
使用名称空间std;
复制(istream_迭代器(cin)、istream_迭代器()、ostream_迭代器(cout,“\n”));
--此命令将所有内容复制到cout中,但我希望将其更改为按相反顺序复制字符串,因此我使用了以下命令:
using namespace std;
reverse_copy(istream_iterator<string>(cin), istream_iterator<string>(),ostream_iterator<string>(cout, "\n"));
使用名称空间std;
反向复制(istream_迭代器(cin)、istream_迭代器()、ostream_迭代器(cout,“\n”));
--但这甚至没有编译。有什么解决办法吗?谢谢你我从来没有听说过一些标准算法可以通过
输入迭代器
甚至向前迭代器
复制反向集合-可能如果存在这种情况,它至少需要双向迭代器
因此,可以使用临时集合存储读取的值,如下所示:
vector<string> tmp;
copy(istream_iterator<string>(cin), istream_iterator<string>(), back_inserter(tmp));
copy(tmp.rbegin(), tmp.rend(), ostream_iterator<string>(cout, "\n"));
向量tmp;
复制(istream_迭代器(cin)、istream_迭代器()、back_插入器(tmp));
复制(tmp.rbegin(),tmp.rend(),ostream_迭代器(cout,“\n”);
的前两个参数必须是while is,它不能作为双向迭代器。这就解释了为什么它不工作——它甚至不会编译
您必须编写自己的迭代器,或者在循环中手动执行迭代器,以解决此问题(这不清楚反向的含义:给定
foo bar
作为输入,您希望bar foo
还是oof rab
,或者rab oof
,正如许多评论员所说的那样)。您可以编写一个递归函数。比如说
#include <iostream>
#include <string>
#include <sstream>
std::ostream & reverse_output( std::istream &is = std::cin,
std::ostream &os = std::cout )
{
std::string s;
if ( is >> s ) reverse_output( is, os ) << s << '\n';
return os;
}
int main()
{
std::istringstream is( "Hello Bobul Mentol" );
reverse_output( is );
}
std::vector<std::string> v( std::istream_iterator<std::string>( std::cin ),
std::istream_iterator<std::string>() );
std::reverse_copy( v.begin(), v.end(),
std::ostream_iterator<std::string>( std::cout, "\n" ) );
当然,您可以使用std::cin
,而不是我用于演示目的的字符串流。在这种情况下,函数的调用看起来就像
reverse_output();
否则,您需要将输入存储在某个容器中,并使用它反转输入的数据以进行输出
比如说
#include <iostream>
#include <string>
#include <sstream>
std::ostream & reverse_output( std::istream &is = std::cin,
std::ostream &os = std::cout )
{
std::string s;
if ( is >> s ) reverse_output( is, os ) << s << '\n';
return os;
}
int main()
{
std::istringstream is( "Hello Bobul Mentol" );
reverse_output( is );
}
std::vector<std::string> v( std::istream_iterator<std::string>( std::cin ),
std::istream_iterator<std::string>() );
std::reverse_copy( v.begin(), v.end(),
std::ostream_iterator<std::string>( std::cout, "\n" ) );
std::vector v(std::istream_迭代器(std::cin),
std::istreamu迭代器();
标准::反向拷贝(v.begin(),v.end(),
std::ostream_迭代器(std::cout,“\n”);
这里有一个普遍的问题:std::cin
是一个流。当它附加到一个文件时,您可以想象一种最初找到大小的方法,从而知道反向迭代器应该从哪里开始。但是,当它连接到终端时,如果一个人能够随意输入数据,那么反向迭代器应该在什么位置启动呢?我不知道,而且看起来cin
designer没有更多-更严重的是,cin
没有提出反向迭代器,它是通过设计实现的
如果您想以相反的顺序显示cin中输入的内容,必须首先指定:
- 要反转的输入是什么:流关闭之前的任何输入,或行的第一个结尾之前的任何输入,或[在这里输入您自己的定义]。一旦完成,您就有了反向迭代器的起点
- 要反转的单位是什么:一次一个字符或一个单词。完成后,您就知道反向迭代器应该返回什么
实现可以使用字符串向量。您始终在其中累积单词或单个字符,直到您定义为流的结尾。一旦到达末尾,您就拥有一个带有双向迭代器的容器,因此以相反的顺序复制它应该很容易。“以相反的方式复制字符串”-单独反转每个字符串,或者反转复制顺序?i、 例如,“foo-bar”=>“bar-foo”或“oof-rab”?这是什么意思?您得到什么输出?reverse\u copy
需要一个双向迭代器,但istream\u迭代器
是一个输入迭代器。也许先把它读入某个集合,然后再将其反转?如果你想尊重每个单词而不是整个输入(例如,“foo bar”变成“oof rab”),那么编写你自己的ostream\u reverse\u迭代器并不难。如果您想颠倒单词的顺序(例如,“foo-bar”变成“bar-foo”),那么您需要其他解决方案。如果你想完全反转输入(“foo-bar”变成“rab-oof”),这是第三个问题。现在,您想要哪种变体?对于一些示例输入,输出应该是什么?请澄清!此外,在未来,“这没有很好地工作”不是一个很好的问题描述。请您可能还想学习如何创建一个。