在刷题的时候,用cin/cout有时候会出现TLE,也就是超时的情况,但是换成scanf/printf的时候就会AC通过。那么是否cout cin就比scanf和printf慢呢。
在C语言中是用printf函数进行输出,用scanf函数进行输入的。c++保留了c语言的这个用法。而cin 和 cout就是属于c++的内置对象。
cin cout是类对象,scanf printf是函数。作为函数,就是定义一个函数,然后把出现%的地方取代。但是cin cout作为类对象重载了运算符
<<
和
>>
why cin cout比scanf printf慢?
因为cin 和 cout在做类型判断的时候是由编译器完成的,用户不需要管输入或输出的类型,编译器会帮你找云算子规则,所以我们这里的编译速度就会下降。由于不需要做类型判断,所以我们在输入输出时候的自由度更高,可以自己定义。而scanf和printf将类别判断交给了执行过程,而不是在编译期间完成,所以速度会相对较快。
cin cout预设必须和stdin stdout同步,必须做额外的运算。这里我们可以吧stdio关掉。但是stdio关掉之后scanf和printf就不能用了。
ios_base::sync_with_stdio(false);
endl和flush使用:cout缓冲区。cout用了一个类似优化的设计,叫作缓冲区(由作业系统实作),所有的输出都会先进到缓冲区里,直到缓冲区满了才会清空缓冲区并把字串输出到stdout之类的输出串流,难怪没有跟stdout同步会出错。而当一般人写程式的时候,输出当然希望程式会把东西印到萤幕上,但是如果缓冲区还没满,我们就看不到结果了!怎么办呢? cout有一个物件叫作flush(用法跟endl一样),做的事情就是强迫清空缓冲区,并输出到串流。其实endl就是<<’\n’<。所以我们最后在写换行符的时候可以用\n来代替endl,速度可以
快十几秒左右
哦~。
cin 和 cout
内置对象。
cin和cout是c++编程语言中的标准输入输出流对象,是iostream类的对象,
而且是内置对象,而不是关键字
。cin和cout分别是ostream和istream类的对象,它们是由标准库的开发者提前创建好的,可以直接拿来使用。
这种在C++中提前创建好的对象称之为内置对象。
输入和输出不是c++本身定义的,而是在编译系统中提供的I/O库中定义的。
运算符。
使用cout进行输出时要使用
<<
运算符,使用cin进行输入时要紧跟
>>
运算符,这两个运算符可以自行分析所处理的数据类型,用户不必通知计算机按何种类型输入输出,因此无需像使用scanf和printf那样给出格式控制字符串。本来
<<运算符和>运算符>
是左移和右移运算符,C++在这里对这两个运算符分别进行了重载,使其能够用于不同数据的输入和输出,但输入输出的对象只能是C++内置的数据类型和标准库中所包含的类型(例如 string complex ofstream ifstream)
endl
表示换行符,也可以用
\n
代替。
cin在读取数据的时候是从缓冲区读取数据的。当键盘这个终端输入数据的时候,通过回车键
\r
将字符串送入缓冲区。
头文件引入
#include <iostream>
cout基本格式
cout<< 表达式1 << 表达式2 << …… << 表达式n ;
cout<< 表达式 << endl;
cout<< 表达式1
<< 表达式2;
cout<< a+b+c;
cin基本格式
cin >> 变量1 >> 变量2 >> …… >> 变量n ;
cin >>a
注意:不能将空格字符和回车换行作为字符输入给字符变量,他们将被跳过。如果想将空格字符或回车换行符输入给字符变量,可以用getline()
函数。
使用控制字符
有时候我们需要输出一些特殊要求的结果,比如保留两位小数,数据向左对齐或向右对齐等。c++提供了输入输出流中使用的控制符。
头文件#include <iomanip>
下图是<iomanip>
所包含的所有成员函数。
setprecision()
。这个函数中prcision是精确度的意思,setprecision就是设置精确度的意思。使用 setprecision(n 可控制输出流显示浮点数的数字个数 C++ 默认的流输出数值有效位是 6 setprecision(n)就是输出 n 个数,会有四舍五入。
setiosflags(ios::fixed|ios::showpoint)
。setprecision(n)与setiosflags(ios::fixed)合用,可以控制小数点右边的数字个数。 当 setprecision( ) 的精度为 0 的时候,有 showpoint ,结果就会显示小数点,没 showpoint, 就不显示小数点。
举例: 输出双精度数。
double a=123.456789012345;对a赋初值
(1) cout<<a;输出: 123.456
(2) cout<<setprecision(9)<<a;输出: 123.456789
(3) cout<<setprecision(6);恢复默认格式(精度为6)
(4) cout<< setiosflags(ios∷fixed);输出: 123.456789
(5) cout<<setiosflags(ios∷fixed)<<setprecision(8)<<a;输出: 123.45678901
(6) cout<<setiosflags(ios∷scientific)<<a;输出: 1.234568e+02
(7) cout<<setiosflags(ios∷scientific)<<setprecision(4)<<a; 输出: 1.2346e02
下面是整数输出的例子:
int b=123456;对b赋初值
(1) cout<<b;输出: 123456
(2) cout<<hex<<b; 输出: 1e240
(3) cout<<setiosflags(ios∷uppercase)<<b;输出: 1E240
(4) cout<<setw(10)<<b<<','<<b; 输出: 123456,123456
(5) cout<<setfill('*')<<setw(10)<<b;输出: **** 123456
(6) cout<<setiosflags(ios∷showpos)<<b;输出: +123456
如果在多个cout语句中使用相同的setw(n),并使用setiosflags(ios∷right),可以实现各行数据右对齐,如果指定相同的精度,可以实现上下小数点对齐。
#include <iostream>
#include <iomanip>
int main () {
std::cout << std::setw(10);
std::cout << 77 << std::endl;
return 0;
Output:
这里显示不清,实际上有10个字符,且右对齐,这里默认右对齐。
有关cin的一些函数
cin.get()
![NT@J]J88$67(`S9~17B6WXE.png](p1-juejin.byteimg.com/tos-cn-i-k3…)
cin.getline()
获得字符串的一整行输入包括空格等。
scanf和printf
在C语言中是用printf函数进行输出,用scanf函数进行输入的。c++保留了c语言的这个用法。本质上scanf和printf是一个定义函数。
printf用法
int printf(const char *format[,argument]);
format:由格式说明和普通字符构成。格式说明定义argument的显示格式,以“%”开头,后接格式字符。格式字符前还可以有其他修饰符,表述输出的宽度、精度等。
format样式如下:
%[flags][width][.precision][length]格式字符
1.格式字符
2.flags:对齐方式
3.width:宽度
![3HKLKH}BMWZ$W]{PB)UP8]1.png](p1-juejin.byteimg.com/tos-cn-i-k3…)
4.precision:精度
#include <stdio.h>
using namespace std;
int main()
printf("%d\n",123);
printf("%f\n",13.14);
printf("%c\n",'X');
printf("%s\n","Hello, world!");
printf("%.3f\n",3.1415926);
printf("%+d\n",521);
return 0;
scanf用法
int scanf(const char *format[,argument]);
format:由格式说明、空白字符与非空白字符构成。格式说明指示了argument的输入格式,以“%”开头,后接格式字符。格式字符前还可以有其他修饰符。
format样式如下:
%[*][width][modifiers]格式字符
1.格式字符
2.修饰符说明
#include <stdio.h>
using namespace std;
int main()
int a,b,c;
char x;
scanf("%d",&a);
scanf("%d%d",&b,&c);
scanf("%c",&x);
return 0;
这是一次对c++中基本输入输出功能一次比较全面的比较和总结,希望对做PAT以及其他程序设计比如ACM的小伙伴们有所帮助。