快读快写 模版

 

 

  1. #include<cstdio>  
  2. #include<iostream>  
  3. #include<cctype>  
  4. using namespace std;  
  5. int read()  
  6. {  
  7.     int s = 0, f = 1;  
  8.     char ch = getchar();  
  9.     while(!isdigit(ch)) {  
  10.         if(ch == '-') f = -1;  
  11.         ch = getchar();  
  12.     }  
  13.     while(isdigit(ch)) {  
  14.         s = s * 10 + ch - '0';  
  15.         ch = getchar();  
  16.     }  
  17.     return s * f;  
  18. }  
  19. void write(int x)  
  20. {  
  21.     if(x < 0) {  
  22.         putchar('-');  
  23.         x = -x;  
  24.     }  
  25.     if(x > 9)  
  26.         write(x/10);  
  27.     putchar(x % 10 - '0');  
  28.     return;  
  29. }  
  30. int main()  
  31. {  
  32.     int a;  
  33.     a = read();  
  34.     write(a);  
  35.     return 0;  
  36. }  

一些问题:

1. 快读快写比标准输入输出流以及C的格式化输入输出要快,主要是由于直接利用了单个字符操作,并且适用范围仅限所定义的返回类型与输出类型,牺牲了标准输入输出的普适性而换取了效率,在算法竞赛中具有广泛的应用空间。

2. 快读、快写函数的实现分别用到了循环和递归,从理论上讲无法完成内联,inline建议不会被编译器采纳;通过在vijos上对某一需要大量输入的题目使用快读进行测试,可以发现read()前加入或不加入inline的效率几乎相同。由此可以判断inline大概率被忽略,或是函数调用和返回的时间微不足道,inline的确没有必要。(不理解的同学可从材料和各大博客了解内联函数的相关知识)

3. 该方法利用了cctype库中的字符判断函数isdigit(),其效率与手写ASCII码判断几乎不相上下,甚至更快,可以说同时实现了简洁与快捷,建议使用。

4. 理论上效率较高的写法是将read中所定义的变量加入寄存器建议,但是实测的效率相差并不大。依然有指令被编译器忽略的可能性,因此加不加入就看自己的想法了。

5. read(void)函数也可以写成read(&int)的形式(对地址进行直接赋值操作),效率方面没有太大差别,可以按照个人爱好采用不同风格。

6. 一种更快的fread()式快读可以进一步显著提升读入效率,但写法较为复杂,且需要额外开辟内存,出错率高,在OI中用途有限,有兴趣的同学可以自行学习了解。

 

太原五中

袁盛琪

2019年3月26日

 

----------------------------------------------

2019.7.7 做一个补充

  1. template <typename T>  
  2. void read(T &x) {  
  3.     x = 0;  
  4.     int f = 1;  
  5.     char ch = getchar();  
  6.     while (!isdigit(ch)) {  
  7.         if (ch == '-') f = -1;  
  8.         ch = getchar();  
  9.     }  
  10.     while (isdigit(ch)) {  
  11.         x = x * 10 + (ch ^ 48);  
  12.         ch = getchar();  
  13.     }  
  14.     x *= f;  
  15.     return;  

以上是使用模板template的快速读入。它可以读取任何格式(当然必须是数值)的数据,写起来略有麻烦,但还是很实用的。

再说明一个以前的小问题:register编译建议是在每个函数进程中重新定义的,即便是读入int64范围的数据,函数变量也最多会迭代20次左右,每次把它定义在寄存器里其实有点鸡肋。(反正我已经不这么写了)

转载于:https://www.cnblogs.com/TY02/p/10606685.html

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值