快读快写,顾名思义,就是提升输入和输出的速度。在这里简单介绍一下几种输入输出的优劣。
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!@#$%^ &*()[]{}:""<>''
*/
发表回复