读入优化是个很实用的东西,很简单,代码很短,但是它能让你的程序输入数据比scanf和cin(尤其是cin)快了不知道多少倍。

我们怎么实现它呢?

思想:scanf和cin都支持各种类型的输入,所以它需要判断我们需要输入什么类型的变量,很慢。我们如果只需要输入数字,就可以写读入优化。用getchar()一个一个读入字符,如果这是个数字就把它接在我们保存返回值的变量中。

有两种版本:

版本1:

int read()
{
    int dig=0;char c=getchar();
    while(!isdigit(c))c=getchar();
    while(isdigit(c))dig=dig*10+c-'0',c=getchar();
    return dig;
}

版本2:

template<typename tp>void read(tp & dig)
{
    char c=getchar();dig=0;
    while(!isdigit(c))c=getchar();
    while(isdigit(c))dig=dig*10+c-'0',c=getchar();
}

两种版本不同之处就是版本二定义了一个类型,支持各种类型(如int,long long,unsigned long long…)的输入,不用因为类型改变而改代码。而版本一只支持int型输入,如果要读入别的类型得改代码。
而且版本二短一点~╮(╯_╰)╭

总之……自己选吧。

代码所需要的头文件:

#include <cstdio>
#include <cctype>

cctype里包含了isdigit函数,参数为1个char型变量,返回一个布尔值,为true表示这是个数字(’0’到’9’),为false表示这不是个数字。

如果需要读入负数,那就加个特殊判断就行了,比读入非负数的速度慢一点,但是肯定比scanf和cin快了几条街。

可以读负数的读入优化:

template<typename _Tp>inline void IN(_Tp&dig)
{
    char c;bool flag=0;dig=0;
    while(c=getchar(),!isdigit(c))if(c=='-')flag=1;
    while(isdigit(c))dig=dig*10+c-'0',c=getchar();
    if(flag)dig=-dig;
}
分类: 文章

XZYQvQ

炒鸡辣鸡的制杖蒟蒻一枚QvQ

发表评论

电子邮件地址不会被公开。 必填项已用*标注

你是机器人吗? =。= *