竞赛选手几乎都会写的两行 C++ 代码
在刷算法题、打竞赛的人里,几乎都能看到 main() 里先写这两行:
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
}
很多新手会觉得像“祖传模板”,但它们确实能在 IO 很重的题里显著提速。原因主要有两个:同步和自动刷新。
1) 为什么 ios::sync_with_stdio(false) 能加速?
C++ 常用输入输出是 cin / cout。默认情况下,它们会和 C 的 scanf / printf 保持同步。
同步的意思是:当你用 cout 输出时,C++ 的 IO 层会和 C 的 stdio 层做额外的协调工作,确保两套机制混用时输出顺序一致。但在竞赛里我们通常只用 cin/cout,不需要这种同步,反而增加开销。
所以这一行:
ios::sync_with_stdio(false);
会解除 C++ IO 与 C IO 的同步,从而减少不必要的开销,尤其在大量读写数据时更明显。
2) 为什么 cin.tie(nullptr) 也能加速?
cout 并不会每输出一次就立刻写到终端,而是先进入缓冲区,之后再统一刷新(flush),因为频繁和操作系统交互很慢。
默认情况下,cin 会“绑定”(tie)到 cout:每次执行 cin 读取之前,都会自动把 cout 的缓冲区刷新一次,以保证交互式程序里提示信息能及时显示。
但竞赛题不是交互式程序,没必要每次读入前都 flush,于是这一行:
cin.tie(nullptr);
会解除 cin 与 cout 的绑定,避免额外的自动刷新,进一步提升 IO 性能。
推荐写法
把两行放在 main() 最开始:
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
}
什么时候不建议用?
- 你混用
scanf/printf和cin/cout时(关闭同步后可能导致顺序问题)。 - 交互题需要及时输出提示并立刻读取输入时(tie 可能影响提示及时显示)。
除此之外,在大多数竞赛/刷题场景里,这两行属于“低成本高收益”的常规优化,写上基本不会错。
高中时参加 NOIP,用的是 Turbo Pascal。那时候写竞赛代码,基本不追求可读性,各种“骚操作”层出不穷,代码往往晦涩难懂,但这并不妨碍最后拿奖。
竞技编程本身就更强调效率和技巧,而不是可维护性。甚至像每年举办的 C 语言混淆大赛,写出来的代码几乎没人能一眼看懂,却依然能正确运行,效果惊艳。
类似地,很多 Python 也能用一两行写出看似“神奇”的实现,但放到工业环境里几乎不可维护、不可扩展。
竞赛代码和工程代码,本质上是两种完全不同的思维方式。
英文:Competitive Programming: Two Simple Tricks in C++ To Make Code Faster
本文一共 652 个汉字, 你数一下对不对.上一篇: 一个月考过四个初级微软计算机证书: 云+AI+数据+安全
下一篇: 第一次被微软官方认证为AI工程师助理 AI Engineer Associate (AI-102)