c ++中的快速输入/输出

时间:2012-05-26 01:24:12

标签: c++ c

我需要在编程问题中输入1到10000范围内的大量数字。这些问题建议使用快速I / O方法。

我看了Fast input/output in competitive programming但是太复杂了。那么任何人都可以告诉我一个更快捷的方法。

另请告诉我使用gets然后执行atoi()比使用scanf(%d)将数字作为输入更快。

4 个答案:

答案 0 :(得分:3)

要回答问题的第二部分,对我而言,似乎atoi的速度提高了一倍。请考虑以下事项:

#define ITERS 1000000

clock_t testAtoi()
{
    char buffer[64];
    clock_t start = clock();

    for (int i = 0; i < ITERS; i++) {
        sprintf(buffer, "%i", i);
        int l = atoi(buffer);
    }

    return clock() - start;
}

clock_t testScanf()
{
    char buffer[64];
    clock_t start = clock();

    for (int i = 0; i < ITERS; i++) {
        sprintf(buffer, "%i", i);
        int l = 0;
        sscanf(buffer, "%i", &l);
    }

    return clock() - start;
}

int main()
{
    printf("clocks for atoi: %lu\n", testAtoi());
    printf("clocks for sscanf: %lu\n", testScanf());

    return 0;
}

对我来说,使用gcc和-O0(所以我的变量没有被优化掉),程序输出:

  

atoi的时钟:222011
  sscanf的时钟:392409

但是,如果您使用的是FILE *,那么fscanf可能会更快。我现在没时间比较两者,但对于原始字符串,我只会使用atoi

答案 1 :(得分:1)

没有用于快速输入/输出的特定库。 您可以关闭同步,这会将输入合并在一起,并一起打印输出。

在main()中添加以下代码行以关闭同步:

   Col1  Col2  Col3  Key_Col
0     1     2     4        1
1     2   336     6        2
2   343    44     7      343

答案 2 :(得分:0)

请参阅此博客:http://bugdivine.blogspot.com/p/fast-input-reader-in-cc.html

在C / C ++中获取输入的最快方法是从输入缓冲区中读取每个字符并将它们推送到结果变量中,直到找到分隔符。

然而,scanf也非常快,即使在竞争性编程领域,我们也很少使用getchar_unlocked。

答案 3 :(得分:-1)

FASTIO的C / C ++中没有任何特殊的库。

在C / C ++中打印输出的最快方法是在stdio.h库中使用fwrite或fwrite_unlocked。

此外,没有任何特殊/直接功能可以立即打印输出。

间接地,可以使用append函数(将所有输出字符串附加到单个字符串并打印最终字符串)来实现cplusplus甚至是string.h lib中的strcat函数,但性能明智,“附加或连接+打印” ,比较慢,甚至比printf慢得多。

所以c / c ++中最快的方法是:直接读取原始形式的流,并提取所需的信息。还将输出以原始形式放在一个巨大的缓冲区中,最后用fwrite显示。

请尝试通过此链接中的解决方案进行快速IO。(http://www.codechef.com/viewsolution/244848)