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+换行,这个原因我暂时没有搞清楚。不过不影响这个方法是可用的。