了解Getchar已解锁

时间:2015-01-12 10:04:01

标签: c++ c algorithm

我是竞争性编程方面的新手,我发现许多人几乎在他们提交的所有提交中使用以下代码片段。

#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.在竞争性编程和其他应用程序中使用它的逻辑是什么?

1 个答案:

答案 0 :(得分:2)

是的,在大多数情况下,此代码比标准库实现更有效。它对输入做出了更多假设,这使得它更加脆弱,但允许进行额外的优化。这些假设是:数字总是十进制,由单个非数字字符分隔,任何第二个分隔字符总是减去,数字总是小到足以容纳int。这些假设在编程竞赛中是可以接受的,但在大多数情况下不应该以其他方式使用。

getchar只是一个从缓冲输入中返回单个字符的函数。 _unlocked是一个跳过同步并且速度更快的版本,但如果多个线程读取输入,则会导致不可预测的行为。

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