有人可以解释这种快速输入背后的逻辑吗?我知道它比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;
}
答案 0 :(得分:3)
这里的unlocked
部分是为了避免锁定输入文件(因此如果多个线程从同一输入读取,可能会导致问题)。
与使用getchar
的其他人相比,这可能是90%的收益,而这反过来可能只比scanf
稍微好一些。显然,scanf
在解析格式字符串时也有开销,这可能有点开销。
其余代码只是“跳过任何不是数字的东西”,然后将十进制数读入ret
,当数字为非数字时停止。
对于阅读大量输入,我建议使用fread
(或mmap
或MapViewoOfFile
(如果已知系统支持其中一个调用)加载大量缓冲区中的输入数据,然后使用基于指针的方法“跳过非数字”(假设这是一个“安全”的事情)。很可能这比上面的代码更快。