有人能解释一下这个快速输入背后的逻辑吗?我知道它比 scanf 快。
int scan()
{
int ip=getchar_unlocked(),ret=0;
for(;ip<'0'||ip>'9';ip=getchar_unlocked());
for(;ip>='0'&&ip<='9';ip=getchar_unlocked())
ret=ret*10+ip-'0';
return ret;
}
这里的unlocked
部分是避免锁定输入文件(如果多个线程从同一输入读取,则可能会导致问题)。
与其他使用 相比,这可能是 90% 的收益所在,getchar
而这可能仅略好于scanf
。显然,scanf
解析格式字符串也有开销,这可能有点开销。
其余代码只是“跳过任何不是数字的内容”,然后将十进制数字读入ret
,当数字不是数字时停止。
为了读取大量输入,我建议使用fread
(mmap
或者MapViewoOfFile
如果系统已知支持其中一个调用)在缓冲区中加载大量输入数据,然后使用基于指针的方法“跳过超过非数字”(假设这是一个“安全”的事情)。这很可能再次比上面的代码更快。