cin,cout加速和多组输入

1.cin,cout加速:

        std::ios::sync_with_stdio(false);

cin,cout效率低是因为先把要输出的东西存入缓冲区,再输出,导致效率降低。这段语句取消iostream的输入输出缓存,可以显著提高cin和cout效率。当然,也可以使用printf和scanf。

2.cin的输入:

2.1 EOF:

        EOF在操作系统中表示资料源无更多的资料可读取。通常在文本的最后存在此字符表示资料结束。在一般算法题中EOF也用于一组数据输入的结束。

        在linux一般以ctrl+d表示,在windows一般以ctrl+z表示。

2.2 cin输入数字:

        cin输入数字时遇到空格或者非数字(如果cin有符号数可以接收‘-’,浮点数可以接受‘.’)会跳过,结束当前变量的输入但是不会结束当前cin。cin输入的内容必须换行符才能把终端的内容输入到缓冲区。

        看下面例子就会明白: 

int a(0),b(0);
std::ios::sync_with_stdio(false);
std::cin >> a >> b;
std::cout << a << b;


//输入1->输入换行。此时cin不退出,还要输入b的值。
//输入1->输入EOF->输入换行。cin不需输入b的值,直接退出。此时a=1,因为没有输入b所以b=0。
//输入1a2->输入换行。此时a为1,b为0。虽然cin可以跳过不是数字的字符,但是此时b也失效。
//输入1 2->输入换行。此时a=1,b=2。必须输入换行cin才能结束。

2.3 cin接收字符:

        cin直接输入字符时会跳过空格。但是我们可以使用cin.get()接收一个字符,包括空格。例子如下:

char c(0);

//输入空格+a
std::cin>>c; //跳过空格,c为'a'
c=std::cin.get(); //接收空格,c为空格
std::cin.get(c); //等效于上一句

//输入换行+a
std::cin>>c; //跳过换行,c为'a'
c=std::cin.get(); //接收换行,c为换行符
std::cin.get(c); //等效于上一句

//输入EOF(ctrl+z)+a,以下三句均为0,因为EOF的出现使得cin读不到EOF后面的内容
std::cin>>c;
c=std::cin.get();
std::cin.get(c);

 2.4 cin接收字符串:

        接收字符串我们可以使用下列方式:

char c[10];
char d[10];
std::ios::sync_with_stdio(false);

//输入123456789+空格+123456789+换行符
std::cin >> c >> d;  //c和d都是123456789

        但是这种方式会跳过空格,我们可以使用cin.getline。

        cin.getline有三个参数,第一个参数是字符串数组首地址,第二个参数是要读取的字符数,第三个参数是读到某个字符停止。默认为换行符:

char c[10];
//输入123456+空格+78+换行
std::cin.getline(c,10); //得到123456 78
std::cin.getline(c,1); //得到1
std::cin.getline(c,10,'6'); //得到12345

        cin也可以用于stl的string。

2.5 cin和cout输出顺序:

        当我们cin->cout->cin时,如果第一个cin不输入换行符那么只有第二个cin接收到时才会cout。如果第一个cin加了换行那么cout在第二个cin之前。例:

int a(0),b(0);
std::cin >> a >> b;
std::cout << a << b;
std::cin >> a;

//1.输入:1 2 3+换行。此时在换行输完才cout,但是此时cout仍为1,2。
//2.输入:1 2+换行+3+换行。此时在第一个换行结束就cout,为1,2
//3.输入:1+换行+2+换行+3+换行。此时第二个换行结束才cout,为1,2

3.常见多组输入:

3.1 给定长度的输入:

        这种比较简单,先接收长度再输入。例:

//先输入一个长度n,再输入n个数
//例:5 1 2 3 4 5

int a[5];
int n(0);
std::cin>>n;
for(int i=0;i<5;i++){
    std::cin>>i;
}

3.2 不给长度输入多个数:

        如果是int型可以如下:

int a[10];
int i = 0;
while (std::cin >> a[i]) {
	i += 1;
}

        不过这只能处理以EOF结尾的情况。如果是以换行结尾那么只能读字符串了。

        char类型如下:

//法一
char a[10];
int i = 0;
while (std::cin>>a[i]) {
	i += 1;
}

//法2
char a[10];
int i = 0;
while ((a[i] = std::cin.get())&&(a[i]!=EOF)) {
	i += 1;
}

        当在本地输入时结尾需要输入两次EOF+换行,这个原因我暂时没有搞清楚。不过不影响这个方法是可用的。

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值