在刷题的时候,用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),可以实现各行数据右对齐,如果指定相同的精度,可以实现上下小数点对齐。

    // setw example
    #include <iostream>     // std::cout, std::endl
    #include <iomanip>      // std::setw
    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);//123
    	printf("%f\n",13.14);//13.140000
    	printf("%c\n",'X');//X
    	printf("%s\n","Hello, world!");//Hello, world!
    	printf("%.3f\n",3.1415926);//3.142
    	printf("%+d\n",521);//+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的小伙伴们有所帮助。

    分类:
    代码人生
    标签: