1112 字
6 分钟
C++的输入输出
控制小数输出位数:
#include <iomanip>cout << fixed << setprecision(位数) << result << endl;输入优化:
我们都知道,getchar 是用来读入一个字符的数据并将其转换为 char 类型的函数,且速度很快,故可以用“读入字符-转换为整型”来代替缓慢的读入 每个整数由两部分组成——符号和数字
整数的 ’+’ 通常是省略的,且不会对后面数字所代表的值产生影响,而 ’-’ 不可省略,因此要进行判定
10 进制整数中是不含空格或除 0~9 和正负号外的其他字符的,因此在读入不应存在于整数中的字符(通常为空格)时,就可以判定已经读入结束
C 和 C++ 语言分别在 ctype.h 和 cctype 头文件中,提供了函数 isdigit, 这个函数会检查传入的参数是否为十进制数字字符,是则返回 true,否则返回 false。对应的,在下面的代码中,可以使用 isdigit(ch) 代替 ch >= ‘0’ && ch <= ‘9’,而可以使用 !isdigit(ch) 代替 ch <‘0’ || ch> ‘9’
代码实现:
int read() { int x = 0, w = 1; char ch = 0; while (ch < '0' || ch > '9') // ch 不是数字时 { if (ch == '-') w = -1; // 判断是否为负 ch = getchar(); // 继续读入 } while (ch >= '0' && ch <= '9') // ch 是数字时 { x = x * 10 + (ch - '0'); // 将新读入的数字’加’在 x 的后面 // x 是 int 类型,char 类型的 ch 和 ’0’ 会被自动转为其对应的 // ASCII 码,相当于将 ch 转化为对应数字 // 此处也可以使用 (x<<3)+(x<<1) 的写法来代替 x*10 ch = getchar(); // 继续读入 } return x * w; // 数字 * 正负号 = 实际数值}输出优化:
同样,putchar 是用来输出单个字符的函数,因此将数字的每一位转化为字符输出以加速。要注意的是,负号要单独判断输出,并且每次 %(mod)取出的是数字末位,因此要倒序输出
代码实现:
int write(int x) { if (x < 0) { // 判负 + 输出负号 + 变原数为正数 x = -x; putchar('-'); } if (x > 9) write(x / 10); // 递归,将除最后一位外的其他部分放到递归中输出 putchar(x % 10 + '0'); // 已经输出(递归)完 x 末位前的所有数字,输出末位}如何优化输入输出?
- 取消缓冲区同步语句 std::ios::sync_with_stdio(false) C++中cin,cout效率比较低,是因为先把要输出的东西存入缓冲区与C语言中的stdio同步后,再输出,导致效率降低,而这个语句的作用是取消缓冲区同步,直接使用,由此可节省时间,使效率与scanf与printf相差无几。
但需要注意的一点是,因为取消与stdio的同步之后,就不建议再使用 printf 与 scanf了,否则实际输出效率可能还会与预期不符。只能用cin 与 cout,以使得cout和cin的效率得到提高
- 使用tie函数减少IO负担
首先我们需要了解一个可能不知道的事实,那就是C++中的cout和cin并不是独立的,即在使用cout的时候,cin也会执行,反之亦然。正是由于这种情况,当我们遇到数据集超大造成 cin 超时(TLE)的时候,我们可能会认为这是cin的效率不及scanf的原因。其实是输入缓冲区,flush缓冲区,占用了时间。
tie 是将两个 stream 绑定的函数,空参数的话返回当前的输出流指针。如代码:
std::cin.tie(0)在默认的情况下 std::cin 绑定的是 std::cout,每次执行 << 操作符的时候都要调用 flush() 来清理缓冲区(stream buffer),这样会增加 IO 负担。可以通过这句代码std::cin.tie(0)来解除 std::cin 与 std::cout 的绑定,进一步加快执行效率。一个完整且简单的例子如下:
using namespace std; int main() { int i; cin.tie(&cout); cout<<"Enter a number."; cin>>i; }用户输入5然后敲回车后
代码执行的过程是,直接将“Enter a number.”输出到控制台上,然后直接将用户输入的5读入到i中,中间不经过缓冲区。
因此当我们要大量读取数据的时候可以tie函数解绑,来加快数据读取。