此命令是否有任何类似的解决方案:
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"));
- 但这甚至没有编译。这有什么解决方案吗?谢谢
答案 0 :(得分:2)
std::reverse_copy
的前两个参数必须是Bidirectional Iterator而std::istream_iterator
是Input Iterator,它不能表现为双向迭代器。这就解释了为什么它不起作用 - 它甚至无法编译。
您已编写自己的迭代器 - 或者在循环中手动执行 - 以解决此问题(不清楚 reverse 的含义:给定{{1}作为输入,您是否需要foo bar
或bar foo
或oof 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的相反顺序显示已输入的内容,则必须先指定:
实现可以使用字符串向量。您始终在其中累积单词或单个字符,直到您定义为流的结尾。一旦你到达最后,你拿着一个带有双向迭代器的容器,所以应该很容易以相反的顺序复制它。