C++ 那些你踩过或将要踩的坑

Akano 发布于 2023-10-06 5 次阅读


介绍

简单如题,本文将会总结一些在 竞赛C++ 中容易踩到的坑。

根据题目,大部分内容将会和 C++ 本身的机制有关,不过也会加一些竞赛中容易犯的错误。

如果你有一些百思不得其解的错误,可以来本文对照一下;或者新人也可以提前预览一下自己可能会犯的错误,以后就可以避免。

简单的错误大多不会被列入本文,如 int mian() 等。被列入本文的错误不一定会导致你在评测时丢分,而本地能通过的代码也不一定能够在评测环境下正常运行(通常为 Linux 环境)

文章持续更新,最后一次更新 2023.10.6

一.内存覆写

  1. 表层表现:程序陷入死循环,TLE/RE,但是复杂度没有问题,也没有显性的死循环。也可能导致 WA
  2. 检查方法:输出循环的上界($n,t$),检查是否与输入的 $n,t$ 不符。如果是则为本问题。
  3. 发生原因:数组开小,内存越界导致覆盖了其它内存的值,修改了表示范围的值导致出现不可知的后果(可能是WA,RE,TLE)
  4. 解决方案:把数组开大。
  5. 特别说明:如果可用,启用越界警告以避免此情况发生。经常发生在前向星多次建图没有置零 cnt 情况下。

二.vector 扩容导致迭代器失效

  1. 表层表现:RE,访问无效内存(返回值 $3221225477$)
  2. 检查方法:查看代码中是否在可能导致扩容的情况后调用之前赋值的 vector 元素的迭代器,或提前对所有 vector 扩容看程序是否正常
  3. 发生原因:根据 cpp reference 的说明,vector 有着 "更改容量时全部失效" 的特性(由于它的底层原理可知),导致原地址失效。
  4. 解决方法:提前对 vector 扩容(有风险),改为下标索引,等等......
  5. 特别说明:常常在线段树等递归情况下发生。
此作者没有提供个人介绍。
最后更新于 2026-09-10