如何使cin读取速度提高到接近scanf?
cin和cout的速度通常比scanf和printf慢很多,但是只要稍微处理以下,就可以提升到接近scanf的速度。
方法:(可以叠加使用)
1.使用ios_base::sync_with_stdio(false);命令
ios_base::sync_with_stdio(false);的作用:C++标准库默认会同步C++的标准I/O和C的标准I/O。关闭同步之后‘cin’和‘cout’将不再与C标准库的‘scanf’和‘printf’同步,可以减少同步开销,从而提高性能。
cin.tie(NULL);的作用:默认情况下‘cin’与‘cout’是绑定的,接触绑定后,‘cin’和‘cout’将不再相互依赖,减少不必要的刷新操作,从而提高性能。
2.使用cin.tie(NULL);命令
cin.tie(NULL);的作用:默认情况下‘cin’与‘cout’是绑定的,接触绑定后,‘cin’和‘cout’将不再相互依赖,减少不必要的刷新操作,从而提高性能。
奇怪的问题:用不用cout.tie(NULL);?
回答:‘cout’通常不需要解除与其他流的绑定,因为‘cout’的输出操作不依赖于‘cin’的刷新。
3.使用'\n'替代endl
解释:endl会触发流的刷新操作,而'\n'不会。因此,在不用立刻刷新的情况下可以用'\n'替换endl提高速度。
什么是不用立刻刷新的情况:
①当你只是想在控制台上换行,而不需要立刻看到输出结果时。
②当你有一系列连续的输出操作时,可以用'\n'进行换行,减少刷新缓冲区的次数。
4.缓冲输入输出
将输入输出集中在一起处理,减少频繁的I/O操作。例如先将所有输入读入一个字符串或缓冲区再处理。
总结:
一般来说,使用方法1+2就够了。方法3在绝大多数情况下都是可以用的(尤其是当你在竞赛或者考试时)。
by:AlenaNuna