Markchai
杏花疏影里,吹笛到天明。
Markchai 的博客

终极快读/快写

快读快写,顾名思义,就是提升输入和输出的速度。在这里简单介绍一下几种输入输出的优劣。

C++ cin/cout 输入输出:优点是读入的时候不用管数据类型,也就是说不用背 scanf/printf 的 %d、%c、%lld 等繁琐的东西,但是缺点就是比scanf/printf慢一些。

C scanf/printf 输入输出:与 C++ 对比,比 cin/cout 快一些,但使用方法细节比较多,容易出锅。

快读/快写:只能处理整数读入/输出,但是要比标准输入输出函数都快得多。

普通方法

快读

template
inline void read(type &x)
{
    x = 0; bool flag(0); char ch = getchar();
    while (!isdigit(ch)) flag = ch == '-', ch = getchar();
    while(isdigit(ch)) x = (x << 1) + (x << 3) + (ch ^ 48), ch = getchar();
    flag ? x = -x : 0;
}

用法

read(x);

快写

template
inline void write(type x, bool mode = 1) // 0为空格,1为换行
{
    x <0 ?x =- x, putchar('-') : 0; static short Stack[50], top(0);
    do Stack[++top] = x % 10, x /= 10; while(x);
    while(top) putchar(Stack[top--] | 48);
    mode ? putchar('\n') : putchar(' ');
}

用法

write(x, 0); // 空格
write(x, 1); // 换行

终极快读/快写

缓冲区优化

by Lingyun

#define LOCAL
#include 
#include 

using namespace std;
namespace ly
{
    namespace IO
    {
        #ifndef LOCAL
            #define SIZE (1<<20)
            char in[SIZE],out[SIZE],*p1=in,*p2=in,*p3=out;
            #define getchar() (p1==p2&&(p2=(p1=in)+fread(in,1,SIZE,stdin),p1==p2)?EOF:*p1++)
            #define flush() (fwrite(p3=out,1,SIZE,stdout))
            #define putchar(ch) (p3==out+SIZE&&flush(),*p3++=(ch))
            class Flush{public:~Flush(){flush();}}_;
        #endif
        template
        inline void read(type &x)
        {
            x=0;bool flag(0);char ch=getchar();
            while(!isdigit(ch)) flag^=ch=='-',ch=getchar();
            while(isdigit(ch)) x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
            flag?x=-x:0;
        }
        template
        inline void write(type x,bool flag=1)
        {
            x<0?x=-x,putchar('-'):0;static short Stack[50],top(0);
            do Stack[++top]=x%10,x/=10;while(x);
            while(top) putchar(Stack[top--]|48);
            flag?putchar('\n'):putchar(' ');
        }
        #ifndef LOCAL
            #undef SIZE
            #undef getchar
            #undef putchar
            #undef flush
        #endif
    }
}using namespace ly::IO;

signed main()
{
    int a, b;
    read(a), read(b);
    write(a, 0), write(b);
    return 0;
}

多变量输入

By Lingyun

#define LOCAL
#include
#include
#include
#include
#define ll long long

using namespace std;
namespace ly
{
    namespace IO
    {
        #ifndef LOCAL
            constexpr auto maxn=1<<20;
            char in[maxn],out[maxn],*p1=in,*p2=in,*p3=out;
            #define getchar() (p1==p2&&(p2=(p1=in)+fread(in,1,maxn,stdin),p1==p2)?EOF:*p1++)
            #define flush() (fwrite(out,1,p3-out,stdout))
            #define putchar(x) (p3==out+maxn&&(flush(),p3=out),*p3++=(x))
            class Flush{public:~Flush(){flush();}}_;
        #endif
        namespace usr
        {
            template
            inline type read(type &x)
            {
                x=0;bool flag(0);char ch=getchar();
                while(!isdigit(ch)) flag^=ch=='-',ch=getchar();
                while(isdigit(ch)) x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
                return flag?x=-x:x;
            }
            template
            inline void write(type x)
            {
                x<0?x=-x,putchar('-'):0;
                static short Stack[50],top(0);
                do Stack[++top]=x%10,x/=10;while(x);
                while(top) putchar(Stack[top--]|48);
            }
            inline char read(char &x){do x=getchar();while(isspace(x));return x;}
            inline char write(const char &x){return putchar(x);}
            inline void read(char *x){static char ch;read(ch);do *(x++)=ch;while(!isspace(ch=getchar())&&~ch);}
            templateinline void write(type *x){while(*x)putchar(*(x++));}
            inline void read(string &x){static char ch;read(ch),x.clear();do x+=ch;while(!isspace(ch=getchar())&&~ch);}
            inline void write(const string &x){for(int i=0,len=x.length();iinline void read(type &x,T&...y){read(x),read(y...);}
            template
            inline void write(const type &x,const T&...y){write(x),putchar(' '),write(y...),sizeof...(y)^1?0:putchar('\n');}
            template
            inline void put(const type &x,bool flag=1){write(x),flag?putchar('\n'):putchar(' ');}
        }
        #ifndef LOCAL
            #undef getchar
            #undef flush
            #undef putchar
        #endif
    }using namespace IO::usr;
}using namespace ly::IO::usr;

short a;int b;long long c;__int128 d;char e;char f[20];string g;

signed main()
{
    read(a, b, c, d, e, f, g);
    write(a, b, c, d, e, f, g);
    return 0;
}
/*
32767 2147483647 9223372036854775807 170141183460469231731687303715884105727 A 123abcABC!@#$%^ &*()[]{}:""<>''
*/

发表回复

textsms
account_circle
email

Markchai 的博客

终极快读/快写
快读快写,顾名思义,就是提升输入和输出的速度。在这里简单介绍一下几种输入输出的优劣。 C++ cin/cout 输入输出:优点是读入的时候不用管数据类型,也就是说不用背 scanf/printf 的 …
扫描二维码继续阅读
2024-06-22

Optimized by WPJAM Basic