自己封装的FastIO类,效率虽有所损失,不过实用性提高很多。

测试,写10000000个整数(86M):

  • printf 2.7s
  • cout 27s
  • FastIO 1s

测试,读10000000个整数(86M):

  • scanf 1.8s
  • cin 15s
  • FastIO 1s

       

利用c++的可变参数模板(c++11)和重载可以轻松实现数量不定的混合输入输出。

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  10. 10
  11. 11
  12. 12
  13. 13
  14. 14
  15. 15
  16. 16
  17. 17
  18. 18
  19. 19
  20. 20
  21. 21
  22. 22
  23. 23
  24. 24
  25. 25
  26. 26
  27. 27
  28. 28
  29. 29
  30. 30
  31. 31
  32. 32
  33. 33
  34. 34
  35. 35
  36. 36
  37. 37
  38. 38
  39. 39
  40. 40
  41. 41
  42. 42
  43. 43
  44. 44
  45. 45
  46. 46
  47. 47
  48. 48
  49. 49
  50. 50
  51. 51
  52. 52
  53. 53
  54. 54
  55. 55
  56. 56
  57. 57
  58. 58
  59. 59
  60. 60
  61. 61
  62. 62
  63. 63
  64. 64
  65. 65
  66. 66
  67. 67
  68. 68
  69. 69
  70. 70
  71. 71
  72. 72
  73. 73
  74. 74
  75. 75
  76. 76
  77. 77
  78. 78
  79. 79
  80. 80
  81. 81
  82. 82
  83. 83
  84. 84
  85. 85
  86. 86
  87. 87
  88. 88
  89. 89
  90. 90
  91. 91
  92. 92
  93. 93
  94. 94
  95. 95
  96. 96
  97. 97
  98. 98
  99. 99
  100. 100
  101. 101
  102. 102
  103. 103
  104. 104
  1. class FastIO {
  2. public:
  3. FastIO() {
  4. pin = in;
  5. countin = countout = ;
  6. }
  7. int read2mem() {
  8. return countin = fread(in, , insize, stdin);
  9. fclose(stdin);
  10. }
  11. int write2disk() {
  12. return fwrite(out, , countout, stdout);
  13. fclose(stdout);
  14. }
  15. int read() { return ; }
  16. template<typename T, typename ...R>
  17. int read(T &f, R &...r) {
  18. if (get(f) == -) return -;
  19. c = read(r...);
  20. if (c == -) return -;
  21. return + c;
  22. }
  23. void write() {
  24. put('\n');
  25. }
  26. template<typename T, typename ...R>
  27. void write(const T x, const R ...r) {
  28. put(x);
  29. write(r...);
  30. }
  31. private:
  32. const static int insize = ( << ) * , outsize = ( << ) * ;
  33. char in[insize], out[outsize], *pin;
  34. int countin, countout, a[], c, negative;
  35.  
  36. /*** read ***/
  37. inline bool digit(const char ch) {
  38. return ch == '-' || ch >= '0' && ch <= '9';
  39. }
  40. int get(char s[]) {
  41. while ((*pin == ' ' || *pin == '\n') && pin - in != countin) pin ++;
  42. if (pin - in == countin) return -;
  43. while (*pin != ' ' && *pin != '\n' && pin - in != countin) *s ++ = *pin ++;
  44. *s = ;
  45. return ;
  46. }
  47. int get(char &ch) {
  48. if (pin - in == countin) return -;
  49. ch = *pin ++;
  50. return ;
  51. }
  52. int get(int &buf) {
  53. while (!digit(*pin) && pin - in != countin) pin ++;
  54. if (pin - in == countin) return -;
  55. buf = ;
  56. negative = ;
  57. if (*pin == '-') {
  58. negative = ;
  59. pin ++;
  60. }
  61. while (digit(*pin) && pin - in != countin) {
  62. buf = buf * + *pin - '0';
  63. pin ++;
  64. }
  65. if (negative) buf = -buf;
  66. return ;
  67. }
  68. /*** write ***/
  69. void put(unsigned int x) {
  70. c = ;
  71. a[c ++] = x % + '0';
  72. x /= ;
  73. while (x) {
  74. a[c ++] = x % + '0';
  75. x /= ;
  76. }
  77. while (c) {
  78. out[countout ++] = a[-- c];
  79. }
  80. }
  81. void put(int x) {
  82. c = ;
  83. negative = x < ;
  84. if (negative) {
  85. x = -x;
  86. out[countout ++] = '-';
  87. }
  88. a[c ++] = x % + '0';
  89. x /= ;
  90. while (x) {
  91. a[c ++] = x % + '0';
  92. x /= ;
  93. }
  94. while (c) {
  95. out[countout ++] = a[-- c];
  96. }
  97. }
  98. void put(const char &ch) {
  99. out[countout ++] = ch;
  100. }
  101. void put(char s[]) {
  102. while (*s) out[countout ++] = *s ++;
  103. }
  104. };

[c++ IO加速]快速输入输出的更多相关文章

  1. C++快速输入输出优化

    在这里存一下我的快速输入输出优化 以及写题模板 这里的是$getchar$优化和$putchar$优化,$fread$和$fwrite$暂时咕咕咕 快速输入 这里$define$了一个$I\_int$ ...

  2. JAVA的一般输入输出 和 快速输入输出 (BufferedReader&BufferedWrite)(转载)

    1.JAVA的一般输入输出 和 快速输入输出 (BufferedReader&BufferedWrite) 摘要 本文主要介绍快速输入输出, 文中提到了几个IO类,这里推荐使用Buffered ...

  3. C++IO类&文件输入输出

    C++IO类&文件输入输出 istream(输入流)类型,提供输入操作. ostream(输出流)类型,提供输出操作. cin,一个istream对象,从标准输入读取数据. cout,一个os ...

  4. Fluid + GooseFS 助力云原生数据编排与加速快速落地

    前言 Fluid 作为基于 Kubernetes 开发的面向云原生存算分离场景下的数据调度和编排加速框架,已于近期完成了 v0.6.0 版本的正式发布.腾讯云容器 TKE 团队一直致力于参与 Flui ...

  5. JAVA基础复习与总结<七> File类_基本的IO概念_输入输出

    File类 1.操作目录  mkdir() 创建目录,必须确保父目录存在,如果不存在,创建失败 mkdirs() list() 文件:目录字符串形式 ,只返回目录和文件的名称 listFiles()  ...

  6. 八. 输入输出(IO)操作1.输入输出基本概念

    输入输出(I/O)是指程序与外部设备或其他计算机进行交互的操作.几乎所有的程序都具有输入与输出操作,如从键盘上读取数据,从本地或网络上的文件读取数据或写入数据等.通过输入和输出操作可以从外界接收信息, ...

  7. Java IO之简单输入输出

    Java中的IO分为两个部分,以InputStream和Reader为基类的输入类,以OutputStream和Writer为基类的输出类. 当中InputStream和OutputStream以字节 ...

  8. Java快速输入输出

    一.StreamTokenizer实现快速输入 需要的jar包 import java.io.BufferedReader;import java.io.IOException;import java ...

  9. CC2530通用IO口的输入输出

    一.引脚概述 CC2530有40 个引脚.其中,有21个数字I/O端口,其中P0和P1是8 位端口,P2仅有5位可以使用.P2端口的5个引脚中,有2个需要用作仿真,有2个需要用作晶振.所以可供我们使用 ...

随机推荐

  1. 今天我们来谈谈jquery,

    ---恢复内容开始--- 首先从jquery的两种写法开始: 1.$(document).ready(function(){}); 首先我们的jquery是用来操作DOM节点的,所以必须等到文档加载完 ...

  2. Mac 安装 brew(最新教程,绝对可行)

    现在安装brew,一会报这个错,一会儿报那个错,上网查了很多教程,用了很多时间都是不可以,电脑开VPN翻墙也不行. Warning: The Ruby Homebrew installer is no ...

  3. SpringCloud-Bus 消息总线

    概述 基本介绍 Spring Cloud Bus 目前支持两种消息代理:RabbitMQ.Kafka Spring Cloud Config 配合 Spring Cloud Bus 使用可以实现配置的 ...

  4. javascript-数组简单的认识

    一起组团(什么是数组) 我们知道变量用来存储数据,一个变量只能存储一个内容.假设你想存储10个人的姓名或者存储20个人的数学成绩,就需要10个或20个变量来存储,如果需要存储更多数据,那就会变的更麻烦 ...

  5. 浅谈 PHP 与手机 APP 开发

    来源:http://www.thinkphp.cn/topic/5023.html 一.先简单回答两个问题: 1.PHP 可以开发客户端?答:不可以,因为PHP是脚本语言,是负责完成 B/S架构 或 ...

  6. Linux系统管理第四次作业 磁盘管理 文件系统

    1.为主机新增两块30GB的SCSI硬盘 2.划分3个主分区,各5GB,剩余空间作为扩展分区 [root@localhost ~]# fdisk /dev/sdb 欢迎使用 fdisk (util-l ...

  7. Python3的日期和时间

    2019独角兽企业重金招聘Python工程师标准>>> python 中处理日期时间数据通常使用datetime和time库 因为这两个库中的一些功能有些重复,所以,首先我们来比较一 ...

  8. RxJava--Buffer,GroupBy 对比

    Buffer 设定收集n个元素为一组,以下方代码为例,三个为一组,则当组满三个元素时,返回一次List数据 没组满三个元素时,如果调用onComplete,直接发送剩余元素,没调用onComplete ...

  9. 交换机上的MAC地址表

    拓扑图: 1.首先在R1上的配置: R1(config)#int R1(config)#interface g R1(config)#interface gigabitEthernet 0/0 R1( ...

  10. MySQL 子查询——查询最大值

    子查询指将一个查询语句嵌套在另一个查询语句中.子查询可以在 SELECT.UPDATE 和 DELETE 语句中使用,而且可以进行多层嵌套.在实际开发时,子查询经常出现在 WHERE 子句中.子查询在 ...