我是竞争编程的新手,我发现许多人几乎在他们提交的每个提交中都使用以下代码段。

#define gc getchar_unlocked
int readint()

{
    int f=0,ret=0;
    char c=gc();
    while(c<'0'||c>'9')
        c=gc();
    while(c>='0'&&c<='9')
    {
        ret=ret*10+c-48;
        c=gc();
    }
    return f?-ret:ret;
}

该代码能否确保快速的I / O。在竞争性编程和其他应用程序中使用此逻辑的逻辑是什么?

最佳答案

是的,在大多数情况下,此代码将比标准库实现更有效。它对输入进行了更多的假设,使其更加脆弱,但允许进行其他优化。这些假设是:数字始终为十进制,由单个非数字字符分隔,任何第二个分隔字符始终为负,数字始终足够小以适合int。这些假设在编程竞赛中是可以接受的,但在大多数情况下,不应以其他方式使用。
getchar只是一个从缓冲输入中返回单个字符的函数。 _unlocked是一个跳过同步并且可以更快的版本,但是在有多个线程读取输入的情况下,它将导致无法预料的行为。

通过自己进行缓冲并避免对每个字符进行库调用,可以使此代码更快。尽管这样做可能不值得。

关于c++ - 了解Getchar已解锁,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27899413/

10-13 09:54