C++ 快速输入背后的逻辑
有人能解释一下这种快速输入背后的逻辑吗?我知道它比scanf快C++ 快速输入背后的逻辑,c++,input,C++,Input,有人能解释一下这种快速输入背后的逻辑吗?我知道它比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
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;
}
int扫描()
{
int ip=getchar_unlocked(),ret=0;
对于(;ip'9';ip=getchar_unlocked());
对于(;ip>='0'&&ip,此处的解锁部分是为了避免锁定输入文件(如果多个线程从同一输入读取,则可能会导致问题)
与使用getchar
的其他方法相比,这可能是90%的增益所在,而这可能只比scanf
稍微好一点。显然,scanf
在解析格式字符串时也有开销,这可能是一点开销
代码的其余部分只是“跳过任何非数字的内容”,然后将十进制数读入ret
,当数字为非数字时停止
对于读取大量输入,我建议使用fread
(或者mmap
或者MapViewoOfFile
,如果已知系统支持其中一个调用),在缓冲区中加载大量输入数据,然后使用基于指针的方法“跳过非数字”(假设这是“安全的”操作)。很可能这比上面的代码还要快。你还不明白什么?明白了,沃恩·卡托!!塔克斯..明白了@Mats-peterson..塔克斯回答