cin、cout优化

在默认情况下,std::cin/std::cout 是极为迟缓的输入/输出方式,而 scanf/printf 比 std::cin/std::cout 快得多。
可是为什么会这样呢?如果我更习惯使用C++的输出方式,那么有没有什么办法解决输入输出缓慢的问题呢?


这是因为在默认情况下,cin与stdin总是保持同步的,也就是说这两种方法可以混用,而不必担心文件指针混乱,同时cout和stdout也一样,两者混用不会输出顺序错乱。由于这个特性,所以导致cin和cout有许多额外的开销。

那么我们如何禁用这个特性呢?

关闭同步/解除绑定

std::ios::sync_with_stdio(false)这个函数是一个“是否兼容 stdio”的开关,C++ 为了兼容 C,保证程序在使用了 printf 和 std::cout 的时候不发生混乱,将输出流绑到了一起。
这其实是 C++ 为了兼容而采取的保守措施。我们可以在进行 IO 操作之前将 stdio 解除绑定,但是在这样做之后要注意不能同时使用 std::cin/std::cout 和 scanf/printf。更严格的来说:关闭之后C++ IO和C IO 两者不能混用,否则会造成IO混乱。


tie函数加速

还有一种影响速度的原因是:在默认的情况下std::cin 绑定的是 std::cout ,每次执行 << 操作符的时候都要调用 flush(),这样会增加 IO 负担。

tie 是将两个 stream 绑定的函数,空参数的话返回当前的输出流指针。 可以通过std::cin.tie(0) 和std:cout.tie(0)(0 表示 NULL)来解除 std::cin与 std::cout的绑定,进一步加快执行效率。

在这两种情况优化下,std::cin和std::cout的速度就和scanf和printf基本一样了,甚至更快。

代码实现

注意:

更快的输入优化getchar()

原理

众所周知, getchar 是用来读入 1 byte 的数据并将其转换为 char 类型的函数,且速度很快,故可以用“读入字符——转换为整型”来代替缓慢的读入

每个整数由两部分组成——符号和数字,整数的 ‘+’ 通常是省略的,且不会对后面数字所代表的值产生影响,而 ‘-’ 不可省略,因此要进行判定。
10 进制整数中是不含空格或除 0~9 和正负号外的其他字符的,因此在读入不应存在于整数中的字符(通常为空格)时,就可以判定已经读入结束

C 和 C++ 语言分别在 ctype.h 和 cctype 头文件中,提供了函数 isdigit , 这个函数会检查传入的参数是否为十进制数字字符,是则返回 true ,否则返回 false 。对应的,在下面的代码中,可以使用 isdigit(ch) 代替 ch >= ‘0’ && ch <= ‘9’ ,而可以使用 !isdigit(ch) 代替 ch ‘9’。

代码实现输入函数read()

举例 :我们输入数据时可以这样调用read函数:num=read()

更快的输出优化putchar()

原理

同样是众所周知, putchar 是用来输出单个字符的函数,因此将数字的每一位转化为字符输出以加速,要注意的是,负号要单独判断输出,并且每次 %(mod)取出的是数字末位,因此要倒序输出。

代码实现

递归版

由于递归的任务量比较大,我们可以利用栈来实现非递归。

非递归版

OK,这就是经典的输入输出的优化做法,通常cf榜上的大佬用的都是后面这种方法,这确实很快,比scanf和printf快了约1 / 3 1/31/3了吧。我自己常用的就是第一种优化方法,通常我会利用宏定义来避免这么繁琐,如:#define IOS ios::sync_with_stdio(false);cin.tie(0); cout.tie(0)

那么,在主函数直接使用IOS;语句即可实现优化功能。

编辑整理 丨田培辰

C++为什么空格无法输出_算法竞赛C++常用技巧——输入输出优化(防止TLE)相关推荐

  1. c语言二分法查找一个数_算法竞赛小专题系列(1):二分法、三分法

    本系列是这本算法教材的扩展资料:<算法竞赛入门到进阶>. 罗勇军.郭卫斌. 清华大学出版社 二分法和三分法是算法竞赛中常见的算法思路,本文介绍了它们的理论背景.模板代码.典型题目. 1. ...

  2. puts遇到空格无法输出_输入一句英文,只包含字母和空格,如何输出这句英文中.....-黑马程序员技术交流社区...

    //输入一句英文,只包含字母和空格,如何输出这句英文中的最长单词?再把每个单词的首字母转换成大写! #include #include int main(int argc, const char * ...

  3. 成为计算几何master之路——记算法竞赛中常用的计几算法及思想

    文章目录 成为计算几何MASTER(FAKE)之路 1 引言 1.1 精度 1.2 剖分 1.3 层次化设计 2 点,向量和线 2.1 点积和叉积 2.2 线段(直线) 2.2.1 点在线段上判定 2 ...

  4. 解题报告:P5960 【模板】差分约束算法(及常用技巧)

    P5960 [模板]差分约束算法 差分约束系统 给出 n 个变量和 m 个约束条件,形如 xi−xj≤ckx_i - x_j \leq c_kxi​−xj​≤ck​,你需要求出一组解,使得所有约束条件 ...

  5. c++怎么输入带有空格的字符串_CCF CSP-J/S中常用的输入输出 总结(三)

    实验环境: DEV-C++ 5.11 六.关于文件的输入输出 七.关于string类型变量的赋值和连接操作 八.关于string类型的主要函数和运算 六.关于文件的输入输出 需要使用头文件#inclu ...

  6. a*算法迷宫 c++_算法竞赛专题解析(12):搜索基础

    搜索 搜索,就是查找解空间,它是"暴力法"算法思想的具体实现. 文章目录: 01 搜索简介 02 搜索算法的基本思路 03 BFS的性质和代码实现 04 DFS的常见操作和代码实现 ...

  7. C++为什么空格无法输出_那些C/C++程序员该具备的32个编程修养习惯!

    阅读本文可能需要较长时间. 1.版权和版本 好的程序员会给自己的每个函数,每个文件,都注上版权和版本. 对于C/C++的文件,文件头应该有类似这样的注释: /********************* ...

  8. C++为什么空格无法输出_数据的输入输出举例

    前面已经看到了利用printf函数进行数据输出的程序,现在再介绍一个包含输入和输出的程序. 例:求方程ax^2+bx+c=0的根.a.b.c由键盘输入,设b^2-4ac>0 解题思路:首先要知道 ...

  9. c++矩阵连乘的动态规划算法并输出_算法交流: 7215 简单的整数划分问题 【2.7基本算法之算法效率】...

    [题目描述]7215:简单的整数划分问题 by Oler17WA 将正整数n 表示成一系列正整数之和,n=n1+n2+-+nk, 其中n1>=n2>=->=nk>=1 ,k&g ...

最新文章

  1. qt的exe启动时隐藏图标_系统小技巧:Win10桌面图标问题多 常见3种这么解
  2. SpringBoot Test及注解详解(含Mockito)
  3. C++基础知识-Day8
  4. python newspaper_第74天:Python newspaper 框架
  5. RHEL 6.6安装桌面环境GNOME
  6. 单线程任务 Task.Factory.StartNew 封装
  7. 弹窗页面交互_UI进阶知识-信息提交类弹窗该如何设计?
  8. 收藏 | 深度学习调试经验
  9. ElasticSearch的搜索推荐(typeahead)
  10. 支持的vCenter Server High Availability选项(2096800)
  11. python尼姆游戏_一个傻傻的尼姆游戏及其Python实现
  12. 爬取虎牙TV全站主播信息
  13. 关于Java使用 BigDecimal 的错误 Rounding necessary
  14. 人体体重秤体脂秤方案PCBA设计
  15. android LRUCache解析
  16. 嵌入式 C语言/C++ 常见笔试、面试题 难疑点汇总(经典100道)
  17. MySQL中三种表关系的建立
  18. 认知机器人:相机校准
  19. 基于51单片机的多功能智能语音循迹避障小车
  20. nginx+keepalived+tomcat+memcache负载均衡搭建小集群

热门文章

  1. 使用t-SNE算法对数据进行降维并可视化实战,与KernalPCA、LLE对比降维可视化的效果
  2. 增强学习or强化学习概述
  3. 服务器系统策略功能,设置服务器系统口令复杂度策略
  4. java中打开文件显示_从java程序中打开任何文件
  5. html5 桌面定时提醒,H5界面实现桌面推送通知
  6. 实验三:XML模型(一)
  7. 宝塔显示linux inode,Linux显示inode的信息
  8. mysql数据库目标库_修改mysql数据库的库名
  9. numpy 滑动窗口取数据
  10. 语义分割--Pixel Deconvolutional Networks