c++读入优化
对于输入数据非常大的一些可(变)爱(态)题目,scanf就会大大拖慢程序的运行速度,cin就更不用说了,所以我们要用一种高大上的东西——读入优化。
读入优化的原理其实就是一个一个字符的读入,再组成数字
==================================================================
下面贴一段读入优化的模板
1 int read() 2 { 3 int x=0,f=1; 4 char ch; 5 while(ch<'0'||ch>'9') {if(ch=='-')f=-1;ch=getchar();} 6 while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} 7 return f*x; 8 }
这就是最基本的读入优化,通过getchar函数依次读入字符,用x记录答案,用f判断正负。
ps:在主程序中调用时int n=read();即可
===========================前方高能预警===============================
下面是dalao的读入优化模板
1 template<class T>void read(T &x) 2 { 3 x=0;int f=0;char ch=getchar(); 4 while(ch<'0'||ch>'9') {f|=(ch=='-');ch=getchar();} 5 while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();} 6 x=f?-x:x; 7 return; 8 }
template就是让这个函数随时可以调用,而且可以用int、double、char……(反正很装13就对了)
用了指针,会快更会装13。
下面的f|=(ch=='-')如果ch==‘-’,f就改符号(还可以判断多个负号),位运算,会快
<<x就相当于2^x,会非常快;
最后问号表达式装13
总之就是一个优(装)化(B)的读入优化
ps:不过TA真的比普通的读入优化要很多
pss:调用时直接read(n)就好了这就是指针的好处
===========================我是分割线================================
以下的读入优化需要在freopen条件下使用(其实用的不是很多,大多数情况用上面那种)
下面是比以上读优都要快的julao的读入优化(划重点)fread
1 inline char GET_CHAR(){ 2 static char buf[maxn],*p1=buf,*p2=buf; 3 return p1==p2&&(p2=(p1=buf)+fread(buf,1,maxn,stdin),p1==p2)?EOF:*p1++; 4 } 5 template<class T>void read(T &x) 6 { 7 x=0;int f=0;char ch=GET_CHAR(); 8 while(ch<'0'||ch>'9') {f|=(ch=='-');ch=GET_CHAR();} 9 while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=GET_CHAR();} 10 x=f?-x:x; 11 return; 12 }
简单的来说就是把getchar函数手写,改为文件读入(fread)。
eg:fread原理:把数据流整段的存到数组buf中,整段的读取,数组存满了再重新覆盖。所以比getchar()一个一个读要快
其实我也不是很懂fread,感性理解吧QAQ。
===========================我是分割线================================
一点点忠告:说实话用不用读入优化完全看自己,如果要用就把它当做一个模板,哪怕是a+b的时候也打上。我就是这样(有点读入情节)虽然有的时候并不能快多少,但是至少会让自己的代码效率稍微高那么一丢丢,而且天天打,永远不会错。
但有些dalao平时不用,考试的时候打上,其实我不太建议这样。因为身边有好几个朋友都是因为在考场上读优打错,然后0分。非常的可惜,所以如果考试要用的话最好多打几次保证自己不会错,防止在复赛上gg
NOIP2018RP++;
感谢学姐uncle-lu的模板
61646D696E