繁体   English   中英

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

[英]Fast input/output in c++

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

在竞争性编程中查看了快速输入/输出,但它太复杂了。 所以任何人都可以告诉我一种更简单的方法来获得快速的 io。

也请如果使用的告诉我gets ,然后做atoi()快于使用scanf(%d)采取数字作为输入。

回答你问题的第二部分,对我来说,似乎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

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

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

int main(){
        ios_base::sync_with_stdio(0);
        cin.tie(0);
        // Your code ................
}

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

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

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

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

所以c/c++中最快的方式是:直接读取raw形式的流,提取需要的信息。同时把raw形式的输出放到一个巨大的缓冲区中,最后用fwrite显示出来。

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

参考这个博客: http : //bugdivine.blogspot.com/p/fast-input-reader-in-cc.html

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

但是,scanf 也非常快,即使在竞争性编程的世界中,我们也很少出现必须使用 getchar_unlocked 的情况。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM