2015-02-06 83 views
1

在编程竞赛,往往给定了输入的形式为:识别两个空间分隔符和换行字符在C或C++

1 3 5 544 
4 
2 3 22 
2423 
2 

其中存在由空格分隔的整数的多条线。我一直在试图弄清楚如何在C或C++中读取这些输入,但永远无法真正实现它的工作。我在网上找到的解决方案使用scanf或getline(或fget),但每当我尝试时,他们要么不能识别换行符,要么在我试图将它们与for循环结合使用时,第一次迭代wasn没有执行。

真正的竞争程序员如何阅读这种类型的输入?我知道这个问题可能不够清楚,并且我没有提供代码片段或任何内容 - 如果每个人都发现该帖子不适合论坛,我会删除帖子。

+2

嗨。请向我们展示失败的代码。 – 2015-02-06 09:52:26

+0

我们使用'std :: ifstream :: operator >>'。你可以把换行符当作空格。 – avakar 2015-02-06 09:53:35

+0

'std :: getline'消耗换行符,但不会将其附加到字符串。无论如何,你为什么关心换行符?推测这些挑战有静态的输入,你不需要担心动态地做事。 – 2015-02-06 09:58:02

回答

-1

使用getline()(建议使用“getline函数”,与std::string一起使用,而不是“istream的getline方法”)逐行读取流。

然后提取数字使用std::istringstream初始化用getline()读取的字符串调用。

+0

这对于竞争性编程来说不是好的解决方案 - 开销过大。 – 2015-02-06 10:45:46

-1

在竞争性编程中 - 根本不使用C++输入 - 它太慢了,它会严重影响您的时间(特别是如果预期的解决方案是O(n)或更快)。程序规范通常是以这种方式创建的,那么微不足道的scanf就会完成这项工作(故意,因此您可以专注于算法而不是读取输入)。你的问题是,可能你想解析空白,不知道如何做到这一点(使用scanf - 你不需要)。例如,让我们解析包含由空格分隔的两个整数多行:

int x, y; 
while (foo) { 
    scanf("%d %d", &x, &y); 
} 

这会工作得很好,你并不需要在所有的担心换行。 如果你会遇到这种情况,那scanf太慢了(它可能在竞争中) - 你可能需要通过调用getchar并逐字节地处理输入来创建你自己的专用解析函数。

+0

如果时间对你很重要,而且C++速度太慢 - C更慢,尤其是如果你使用解析和解释,像'printf'或'scanf'这样的函数的话(C++ iostreams不会做任何这样的事情,这就是为什么他们更快)。如果你真的想要一个**完全没有开销的解决方案,使用系统函数直接读取,例如'read()',在这种情况下从描述符为'0'的通道读取。此外,只使用固定大小的静态数组,部分读取流,并逐个读取字符 - 这样您可以查看它是空间,数字还是EOL(scanf也使用tmp动态buf)。 – Ethouris 2015-02-06 11:08:52

+0

@Ethouris你错了。为了确保,我测试了读取两个整数的10^6行 - “scanf”的平均速度比'std :: cin'快3倍,比'std :: getline'快6倍 - + std :: istringstream',因此'scanf'是对于竞争性编程输入的很好解决方案。使用'read'有点没有意义 - 你的计时将类似于使用'getchar',但解析输入将会更加困难 - 你的执行时间将会更好地花在算法上,而不是在这个时候进行微小的io优化。 – 2015-02-06 12:44:59

+0

姆姆。在测试之前,你不忘记在iostreams中关闭sync_with_stdio()吗?您使用了多少数据,并且检查了初始化和实际操作花费了多少时间? – Ethouris 2015-02-06 16:30:32

相关问题