小赖子的英国生活和资讯

竞赛选手几乎都会写的两行 C++ 代码

阅读 桌面完整版

竞赛选手几乎都会写的两行 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);

会解除 cincout 的绑定,避免额外的自动刷新,进一步提升 IO 性能。

推荐写法

把两行放在 main() 最开始:

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
}

什么时候不建议用?

除此之外,在大多数竞赛/刷题场景里,这两行属于“低成本高收益”的常规优化,写上基本不会错。

高中时参加 NOIP,用的是 Turbo Pascal。那时候写竞赛代码,基本不追求可读性,各种“骚操作”层出不穷,代码往往晦涩难懂,但这并不妨碍最后拿奖。

竞技编程本身就更强调效率和技巧,而不是可维护性。甚至像每年举办的 C 语言混淆大赛,写出来的代码几乎没人能一眼看懂,却依然能正确运行,效果惊艳。

类似地,很多 Python 也能用一两行写出看似“神奇”的实现,但放到工业环境里几乎不可维护、不可扩展。

竞赛代码和工程代码,本质上是两种完全不同的思维方式。

英文:Competitive Programming: Two Simple Tricks in C++ To Make Code Faster

强烈推荐

微信公众号: 小赖子的英国生活和资讯 JustYYUK

阅读 桌面完整版
Exit mobile version