读入优化是个很实用的东西,很简单,代码很短,但是它能让你的程序输入数据比 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

0 条评论

发表回复

Avatar placeholder

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