C ++直接将cin复制到cout中,但顺序相反

时间:2015-11-20 08:20:15

标签: c++ algorithm iterator reverse

此命令是否有任何类似的解决方案:

using namespace std;
copy(istream_iterator<string>(cin), istream_iterator<string>(),ostream_iterator<string>(cout, "\n"));

- 此命令将所有内容复制到cout但我想更改它以反向顺序复制字符串,所以我使用了这个:

using namespace std;
reverse_copy(istream_iterator<string>(cin), istream_iterator<string>(),ostream_iterator<string>(cout, "\n"));

- 但这甚至没有编译。这有什么解决方案吗?谢谢

4 个答案:

答案 0 :(得分:2)

std::reverse_copy的前两个参数必须是Bidirectional Iteratorstd::istream_iteratorInput Iterator,它不能表现为双向迭代器。这就解释了为什么它不起作用 - 它甚至无法编译。

您已编写自己的迭代器 - 或者在循环中手动执行 - 以解决此问题(不清楚 reverse 的含义:给定{{1}作为输入,您是否需要foo barbar foooof rab?正如许多评论者所说的那样。)

答案 1 :(得分:2)

您可以编写递归函数。例如

#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 );
}

程序输出

Mentol
Bobul
Hello

当然,我可以使用std::cin代替我用于演示目的的字符串流。在这种情况下,函数的调用看起来就像

    reverse_output();

否则,您需要将输入存储在某个容器中,并使用它来反转输入的数据以进行输出。

例如

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" ) );

答案 2 :(得分:0)

我从来没有听说过某些标准算法可以复制input_iterator甚至forward_iterator的反向集合 - 如果存在,则至少需要bidirectional_iterator

因此,您可以使用临时集合来存储读取的值,如下所示:

vector<string> tmp;
copy(istream_iterator<string>(cin), istream_iterator<string>(), back_inserter(tmp));
copy(tmp.rbegin(), tmp.rend(), ostream_iterator<string>(cout, "\n"));

答案 3 :(得分:0)

此处存在一般问题:std::cin。当它附加到文件时,您可以想象一种初始查找大小的方法,以及如何知道反向迭代器应该从哪里开始。但当它连接到终端时,一个不可思议的人能够随意输入输入数据,反向迭代器应该在什么位置启动?我不知道它,看起来cin设计师已经没有了 - 更严重的是,cin没有提出反向迭代器,它是设计。 / p>

如果您希望以cin的相反顺序显示已输入的内容,则必须先指定:

  • 要反转的输入是什么:直到流被关闭的任何东西,或直到第一行结束的任何东西,或[在这里放置你自己的定义]。一旦完成,您就拥有了反向迭代器的起始位置
  • 要反转的单位是:一次一个字或一个字。完成后,您就会知道您的反向迭代器应该返回什么。

实现可以使用字符串向量。您始终在其中累积单词或单个字符,直到您定义为流的结尾。一旦你到达最后,你拿着一个带有双向迭代器的容器,所以应该很容易以相反的顺序复制它。