众所周知 c++中的cin因为要保存缓冲的缘故速度比scanf慢
默认情况 C++标准streams(cin,cout,cerr...)与相应的C标准程序库文件(stdin,stdout,stderr)同步,也就是是否使用相同的stream缓冲区,但由于同步会带来某些不必要的负担,因此我们可以利用以下函数取消同步
std::ios::sync_with_stdio(false);
实验证明 当数据量n在10^6以上时 没有关同步的cin比scanf至少慢上一倍 而关闭同步后的cin事实上比scanf更快
注意:关闭同步的方法只对C++适用 对G++不适用(有些平台可能会不支持c++关闭同步) 并且关闭同步后不能再cin与scanf混用(可能造成顺序错误)
接下来给大家介绍一种比scanf和cin关闭同步更快的读取整形数的方法 即利用getchar代替scanf 代码如下
inline bool get(int &t)
{
bool flag = 0 ;
char c;
while(!isdigit(c = getchar())&&c!='-') if( c == -1 ) break ;
if( c == -1 ) return 0 ;
if(c=='-') flag = 1 , t = 0 ;
else t = c ^ 48;
while(isdigit(c = getchar())) t = (t << 1) + (t << 3) + (c ^ 48) ;
if(flag) t = -t ;
return 1 ;
}
注意:加入头文件 cctype
这里get(t)==scanf("%d",&t)
实验证明 用getchar代替scanf读取整数时会提高好几倍的效率 而读取负数时影响则不是太大