相信使用C++的人都有一种迷惑或者是不自信:在输入输出的时候是不是应该使用scanf/printf更好呢,因为传说cin/cout龟速,我当时也长期被这个所困扰,后来在阅读C++ primer第五版的时候我自己做了一个测试,发现如果不使用std::ios_sync_with_stdio(false);关闭和C库函数的同步的话的确scanf/printf快很多,大概相差五倍,但是如果关闭同步的话,cin/cout是比scanf/printf快8%-10%的。(这两个数据是我后面看别人测量的,我自己只是简单测量了一下)

之所以关闭缓冲以后cin/cout比较快,是因为cin/cout对输入参数和类型的推断是在编译时确定的,而scanf/printf是在运行时确定的。

在我以前的一篇博客:C++Primer学习笔记:第1章 开始中我提到了这一点。

如果认为我自己的测量可能有误差,可以看一下大神们的回答:
Cin-Cout vs Scanf-Printf
Using scanf() in C++ programs is faster than using cin?

和我的说法是一致的,以后被人怼你怎么还用cin/cout的时候,你可以拿出这些测评让他们瞧瞧,我们也应该对C++自信起来,不要想着C++没有C底层好像速度就差一些。

但是之前参加竞赛的时候,我信心满满地使用cin/cout进行输入输出,却总是TEL,我以为是程序算法的问题,检查了好久好久,最后才发现是因为使用了cin/cout的原因,改成scanf/printf后程序就AC了,看到这里你是不是心里一惊:搞什么嘛,上面的测评都是唬人的嘛

其实之所以即使关闭了和C库的同步,我的程序还会TEL和cin/cout没有什么关系,罪魁祸首是endl,相信很多学习C++的人都和我一样,习惯了使用endl进行换行,同时刷新缓冲区,一举两得,美滋滋,但是其实正是因为endl会强制刷新缓冲区,导致频繁的IO操作,使得程序效率迅速降低。因此除非是使用打桩调试(就是及时输出调试信息,因为这里我们要求输出信息有时效性,所以要及时刷新缓冲区),否则都不要使用endl,而使用\n进行换行。

知道了这两点:

std::ios::sync_with_stdio(false);
cout << "Hello world" << "\n";

我们就可以放心地使用cin/cout进行输入输出啦,而且效率肯定是最快的。

在使用cin进行循环读入的时候可能会遇到一点问题,可以参考一下我以前写的一篇博客:C++ cin 实现循环读入

有了上面的准备,我们就可以使用cin/cout开心地写代码啦。

C++输入输出:cin/cout 还是 scanf/printf?相关推荐

  1. C++流式输入输出加速 给 cin/cout 装个小火箭

    C++流式输法加速 文章目录 C++流式输法加速 1. sync_with_stdio 和 endl 1.1 cin/cout 1.2 endl 2. cin.tie(0) External 相信很多 ...

  2. C++入门之cin cout

    C++入门之cout语句 1.认识cin和cout c++中常用的输入输出语句有 "scanf" "printf" 和 "cin" &quo ...

  3. [笔记]cin、cout与scanf、printf的效率差异对比分析

    之前上传UVa227 puzzle时,好不容易AC了,但发现自己用时50(ms),而在VJ上看到人家都是40ms.20ms,于是打开一个20ms的代码查看人家强在哪里.但结果研究了半天感觉差不多,于是 ...

  4. 牛客网循环输入输出测试——C语言scanf和printf用法

    在实际的编程中需要自己写出完整的程序,预留好输入的接口,使用while循环接收多个测试用例,C语言在输出时printf要用换行"\n". 字符串输入输出问题见博客:牛客网字符/字符 ...

  5. scanf printf sprintf fprintf

    都是C语言中的函数,但C++保留了这些函数,在头文件iostream中声明了. 1 scanf(格式控制,输出列表) printf (格式控制,输出列表) 举例: #include <iostr ...

  6. c函数scanf(),printf()等常用格式字符串

    %d   短整形,一般占两个字节 %u   无符号短整形 %ld  长整形,一般占四个字节 %c   字符型 %s    字符串 主要用在输入输出函数:scanf(),printf()里 /a:蜂鸣, ...

  7. C++基础::cin/cout

    cin/cout 的本质是流,cin 是输入流(istream),cout 是输出流(ostream). 进制: 默认十进制输出:cout << dec << 100 < ...

  8. C++中的cin cout

    #include using namespace std; //c++的输入输出流头文件 1.cin ①cin>>a; 直接输入变量. ②同时输入多个变量也是一样的写法. cin a> ...

  9. ACM C++ cin cout 加速IO

    #include <iostream> int main() {std::ios::sync_with_stdio(false);//这句话放在main里面的开始位置,就可以加速cin c ...

最新文章

  1. 查看mysql数据库及表编码格式
  2. 020_Jedis的Set数据类型
  3. 后台开发人员面试内容——计算机网络(五)
  4. python+requests进行get、post方法接口测试
  5. jmeter使用_jmeter概念及使用
  6. WPF入门教学(C#窗口、客户端)
  7. 20HZ信号发生器电路图
  8. 毕业论文页眉页脚页码插入
  9. iOS 安装包瘦身(下篇)
  10. Unity优化大全(八)之 GPU-Ligh和其他
  11. 纯CSS3流光边框特效
  12. 用Navicat连接MySQL的安装及配置
  13. Nonce Used1
  14. mybtisset where tirm 等标签的作用
  15. 矩形障碍算例(附Fortran计算代码及MATLAB后处理代码)
  16. 今日金融词汇---新股限购,是什么?
  17. 给浏览器设置一个图片背景/主题
  18. 01-kernel打补丁,配置,编译流程
  19. 图片如何批量重命名?其实重命名很简单
  20. CEGUI安装、编译、运行总结

热门文章

  1. [TypeScript] Export public types from your library
  2. MongoDB存储基础教程
  3. Windows环境下安装、卸载Apache
  4. Jmeter 场景设计
  5. 04 linux用户群组和权限
  6. Ubuntu下将Sublime Text设置为默认编辑器
  7. 每天自动给自己发天气预报的脚本
  8. vue 启动时卡死_十分钟浅入Vue 原理
  9. 区别和联系_动机与主题的区别与联系
  10. access数据库为什么一直登陆_为什么要养成用Access数据库保存数据的习惯?