Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;直接将cin复制到cout中,但顺序相反_C++_Algorithm_Iterator_Reverse - Fatal编程技术网

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”),这是第三个问题。现在,您想要哪种变体?对于一些示例输入,输出应该是什么?请澄清!此外,在未来,“这没有很好地工作”不是一个很好的问题描述。请您可能还想学习如何创建一个。