丢人笔记:黑科技——使用streambuf加速读入输出
UPD20191125:我发现我又丢人了,sgetc只会读取缓冲区当前字符而不会前移读取位置,想要读取并前移读取位置应该用sbumpc。。。 一般情况下,在C++中,iostream内的cin和cout是比scanf和printf慢的,这主要是为了同时兼容iostream和stdio,iostream与stdio的缓冲区被绑到了一起,以及cin和cout的stream是绑定在一起的,这使得cin和cout有额外的开销 为了提高cin和cout的效率,我们可以取消iostream与stdio的同步,以及cin和cout的stream的绑定: 1 std::ios::sync_with_stdio(false); 2 cin.tie(NULL); 3 cout.tie(NULL); 这样cin与cout就比scanf和printf快了。在本机测试上,iostream甚至比stdio快了6倍左右。然而这样做之后,就不可以将iostream与stdio混用了,然而输入量较大的时候,这种方法仍然无能为力 在stdin中,我们有getchar,想要追求更快的速度,我们有fread 在iostream中我们同样可以达到同样的效率,甚至更快: 首先要获取cin的streambuf: std::streambuf *fb = cin.rdbuf();