C++实用整数快速输入输出模板(C++)

随便写一点放在这里,以后想蛇皮卡常就很方便啦
蒟蒻太懒了,也就暂时不搞什么封namespace之类的操作了
程序结束时记得flush一下。

#include<cstdio>
#define RG register
#define IV inline void
#define TP template<typename T>
#define gc          if(++pi==iend)fread (pi=ibuf,1,SZ,stdin)
#define pc(C) *po=C;if(++po==oend)fwrite(po=obuf,1,SZ,stdout)
const int SZ=1<<20;
char ibuf[SZ],obuf[SZ],*pi=ibuf+SZ-1,*po=obuf;
const char*iend=ibuf+SZ,*oend=obuf+SZ;
TP IV in(RG T&x){
	gc;while(*pi<'-')gc;
	x=*pi&15;gc;
	while(*pi>'-'){x*=10;x+=*pi&15;gc;}
}
TP IV iex(RG T&x){
	gc;while(*pi<'-')gc;
	RG bool f=*pi=='-';if(f)gc;
	x=*pi&15;gc;
	while(*pi>'-'){x*=10;x+=*pi&15;gc;}
	if(f)x=-x;
}
TP IV out(RG T x){
	if(x>9)out(x/10);
	pc(x%10|'0');
}
TP IV oex(RG T x){
	if(x<0){pc('-');x=-x;}
	out(x);
}
int main(){
	//do something
	fwrite(obuf,1,po-obuf,stdout);
	return 0;
}

Tips:

  1. gc只是把指针移动到下一个字符,获得字符直接*pi
  2. 不带ex的只资磁非负整数
  3. out使用了函数堆栈,在数比较小时快,int差不多,longlong级别建议改写成手工字符堆栈

update

附上蒟蒻现在已经敲熟了的gi,非常简单,可以直接应用在输入数据中只有整数的考试题目中,直接替代getchar()式的快读,并不容易写挂。

#define gc if(++ip==ie)fread(ip=buf,1,SZ,stdin)
const int SZ=1<<19;
char buf[SZ],*ie=buf+SZ,*ip=ie-1;
inline int gi(){
    gc;while(*ip<'-')gc;
    bool f=*ip=='-';if(f)gc;
    int x=*ip&15;gc;
    while(*ip>'-'){x*=10;x+=*ip&15;gc;}
    return f?-x:x;
}
posted @ 2018-04-05 17:22  Flash_Hu  阅读(3012)  评论(1编辑  收藏  举报