技术标签: 小白学习笔记
在算法竞赛里,cin和scanf都是C++比较常用的读入变量的方法,但是cin比scanf要慢得多。所以一般处理大量读入(百万级以上)时一般都用scanf处理,少量数据读入时可以用cin。
cin慢的主要原因时必须要跟标准输入输出同步,所以cin读入只要关闭与标准输入输出同步是可以加速的,关闭同步方法如下。
cin.tie(0);
ios::sync_with_stdio(0);
这样优化cin只比scanf稍慢,但是cin用起来比较方便。
但是关闭输入输出是有风险的,比如当我们混用cin和scanf时,例如
int T;
cin >> T;
while(T--){
int n, m;
scanf("%d%d",&n,&m);
...
}
普通情况下这样读入是没有问题的,但是有时候为了加速cin读入,可能我们会优化cin
cin.tie(0);
ios::sync_with_stdio(0);
int T;
cin >> T;
while(T--){
int n, m;
scanf("%d%d",&n,&m);
...
}
这样的话,就会发现输入的数据可能是错误的。
所以我们最好不要混用cin和scanf,如果输入数据大,就全用scanf,数据比较小,图方便可以用cin+优化。如果非要混用,记得一定不能使用语句ios::sync_with_stdio(0);
问题来自pat乙级1033,错误代码如下 用cin输入了两个string,提交代码在第二个测试点出错,改成用getline函数后就不会出错。 原因:测试点的输入第一行就是个空行,代表所有键都是好的,用cin接收不到空行 另外 1、istream类对运算符>>有两个重载,第一个是成员重载,第二个是非成员重载,后者在参数是字符、字符串类型的时候调用,第一个适用于其他int、bool等情况。...
以下知识点来源于这篇博文,感谢,侵删 程序的输入都建有一个缓冲区,即输入缓冲区。一次输入过程是这样的,当一次键盘输入结束时会将输入的数据存入输入缓冲区,而cin直接从输入缓冲区中取数据。正因为cin是直接从缓冲区取数据的,所以有时候当缓冲区中有残留数据时,cin会直接取得这些残留数据而不会请求键盘输入。 回顾之前的代码,你会发现连续的cin或者while循环里的getline,都不会出错,但二者混...
在 C ++ 中 scanf 读入数据要比cin读取要快,在输入较多数据时,应该用scanf进行输入。 事实上,我们进行刷题的时候,对于输入量较大的题,用cin有时会时间超时,改成 scanf 之后 可以正常AC; 对此有两个解释,其一由于cin与stdin有兼容性,时刻要与stdin保持同步,防止文件指针混乱,同时cout与stdout 保持一致,防止输出混乱,因此导致时间增加。其二,...
C++中的cout和printf输出速度是不同的,同样的,cin和scanf输入速度也不同,我们来比较一下。 我们往文件中读入10000000个字母A,比较时间 使用cin 时间为5.67秒 使用scanf 4.146秒 可见,scanf的速度较快,所以一般情况使用scanf...
关于格式化和流式输入输出的一些区别(scanf||cin) 笔者在最初学习C++时,着实享受了一把cin输入的爽感:不需要记忆各变量的标志,书写方式快捷简便…可知道某天在一道CodeForce的题中被疯狂飘红后,一旁的大神给我简单的换成了scanf居然直接通过了(泪目)!于是战战兢兢的又用回了scanf输入…可本着“存在即合理”的原则,cin难道...
#include //输出输入的头文件 #include <Windows.h>//windouws控制台命令的头文件 using namespace std; void Empty_input_buffer() {//代替cin.sync();,清空输入缓冲区 char tmp; while ((tmp = getchar()) != ‘\n’); /*get...
举个简单的例子: 我希望读取三行字符串并立刻输出,但是效果如下: 上面的程序只能读取有效的两行,而第一行是一个空行,这不是我们想要的效果,这个看起来不起眼的错误,会导致笔试题0AC,不要问我怎么知道的。 加一句话即可解决。 见下面代码中的注释: 现在效果如下: 参考博客: https://blog.csdn.net/u011421608/article/details/44591579?utm_s...
scanf比cin快 关于scanf比cin快这个结论大家肯定都知道,但是一般情况下很难体现出来,只有当读入数据很大时,才会体现出scanf的快,以前从来都没有碰到过一道题是卡了cin输入的,但是今天终于碰到了!!!所以记录一下。 cin坑题 原题链接:Simone and graph coloring 题目出处:2020ICPC昆明站 本质上就是求最大下降子序列,并且求出以每一位作为结尾的最大下...
for_each,允许对区间内的元素进行修改,当然transform也可以实现相同的操作,只是transform效率较低,因为transform是通过拷贝函数返回值实现。当然C++11之后for_each变得不再重要,因为range-based for更加直观简单。 接下来我们看一下for_each的实现: 通过源码可以清晰的看出for_each有三个参数,前两个参数用来确定一个区间,...
题目 求出1~ 13的整数中1出现的次数,并算出100 ~ 1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1、10、11、12、13因此共出现6次,但是对于后面问题他就没辙了。ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数(从1 到 n 中1出现的次数)。 知识点 数组 思路 解法一、把所有数字转为字符串,遍历字符串计算所有1的...