【问题标题】:C++ fast cin input streamingC++ 快速 cin 输入流
【发布时间】:2013-10-28 07:18:54
【问题描述】:

我正在尝试以下 SPOJ 问题。我想澄清一下,我不需要解决这个问题,这就是为什么我没有将此问题标记为“算法”。

Multiply the given numbers. 

Input
n [the number of multiplications <= 1000]
l1 l2 [numbers to multiply (at most 10000 decimal digits each)]

Output
The results of multiplications.

Time Limit: 2 seconds.

我有一个简单的解决方案 O(n^2),这是我们在学校学习的方式(将输入读取为字符串并进行逐字符乘法)。我知道我可以通过 Karatsuba 方法进一步优化它。

问题: 我现在的代码是 C++。我在互联网上读到通过scanf 阅读比cin 更快。鉴于输入大小如此之大,在这种情况下会产生显着差异吗?

如果我不想将 C 与 C++ 混合使用,那么任何关于如何改进输入流的想法都会非常有帮助。

谢谢

【问题讨论】:

  • 要记住的是,像 SPOJ 这样的网站上的问题很少适用于现实世界的问题。为了成功地为这些网站制作程序,你必须做一些“黑客”,如果在现实世界的应用程序中使用它们会被忽视。
  • 至于这个具体案例,你确定瓶颈是输入,而不是实际计算?
  • @JoachimPileborg 老实说,我不确定。但是,我发布这个问题也是为了帮助我将来参考。

标签: c++ scanf cin


【解决方案1】:

使用sync_with_stdio:

cin.sync_with_stdio(false);

这将关闭与 cstdio 流的同步并提高速度。

Demo

【讨论】:

  • 我有兴趣看看这是否适用于其他人,因为它似乎从来没有对我产生影响。
  • @falsetru:请注意,由于缓存效果,您的截屏视频没有展示太多内容。第一次读取文件总是较慢(尚未在缓存中)。对于完整的演示,您需要在有/无之间交替测量几次,然后取每个类别的中值或最佳值并进行比较。 OT:好工具!
  • @MatthieuM.,感谢您的评论和更正。顺便说一句,我在录制之前使用同一个输入文件运行了多次。
  • @falsetru: good :) 那么缓存应该不会影响结果!
【解决方案2】:

虽然我永远不会对性能进行全面说明,但在 SPOJ(尤其是 Pyramid 集群)上,我注意到 cinscanf 之间存在显着差异。

如果您认为 I/O 限制了您,我会使用 scanf

并且不要仅仅因为它在 C 中可用而忽略某些东西(那会是很多东西!)

【讨论】:

  • 感谢您的回答。有点题外话,但你能澄清一下什么是金字塔集群吗?
【解决方案3】:

scanf()printf() 也可以在 C++ 中使用。它不会将 C 与 C++混合
只需包含&lt;cstdio&gt; 头文件即可。

当然,scanf()printf() 分别比 cincout 快很多。

【讨论】:

  • 是的,它将混合 C 和 C++(请记住,它们的标准库是语言规范的一部分)。特别是,不使用sync_with_stdio(正如另一个答案正确暗示的那样)将导致不确定的结果,因此。
  • 由于C++库包含了C库的所有头文件,所以我们可以在C++中使用它们。是的,在这种情况下,这是一个混合体。
  • 明确地说,我没有说你“不能混音”。你可以。但是,您的回答错误地声称“这不会混合”。
  • 问题不在于使用scanfprintf,而是使用scanfstd::cinprintfstd::cout/std::cerr。通常,C 和 C++ 库具有 独立 缓冲区,因此如果它们没有同步在一起(通过 sync_with_stdio 控制)会导致奇怪的结果。
猜你喜欢
  • 1970-01-01
  • 2016-07-25
  • 1970-01-01
  • 2011-05-13
  • 1970-01-01
  • 1970-01-01
  • 2017-11-10
  • 2015-11-05
  • 1970-01-01
相关资源
最近更新 更多