介绍
简单如题,本文将会总结一些在 竞赛C++ 中容易踩到的坑。
根据题目,大部分内容将会和 C++ 本身的机制有关,不过也会加一些竞赛中容易犯的错误。
如果你有一些百思不得其解的错误,可以来本文对照一下;或者新人也可以提前预览一下自己可能会犯的错误,以后就可以避免。
简单的错误大多不会被列入本文,如 int mian() 等。被列入本文的错误不一定会导致你在评测时丢分,而本地能通过的代码也不一定能够在评测环境下正常运行(通常为 Linux 环境)
文章持续更新,最后一次更新 2023.10.6
一.内存覆写
- 表层表现:程序陷入死循环,TLE/RE,但是复杂度没有问题,也没有显性的死循环。也可能导致 WA
- 检查方法:输出循环的上界($n,t$),检查是否与输入的 $n,t$ 不符。如果是则为本问题。
- 发生原因:数组开小,内存越界导致覆盖了其它内存的值,修改了表示范围的值导致出现不可知的后果(可能是WA,RE,TLE)
- 解决方案:把数组开大。
- 特别说明:如果可用,启用越界警告以避免此情况发生。经常发生在前向星多次建图没有置零
cnt情况下。
二.vector 扩容导致迭代器失效
- 表层表现:RE,访问无效内存(返回值 $3221225477$)
- 检查方法:查看代码中是否在可能导致扩容的情况后调用之前赋值的
vector元素的迭代器,或提前对所有vector扩容看程序是否正常 - 发生原因:根据 cpp reference 的说明,
vector有着 "更改容量时全部失效" 的特性(由于它的底层原理可知),导致原地址失效。 - 解决方法:提前对
vector扩容(有风险),改为下标索引,等等...... - 特别说明:常常在线段树等递归情况下发生。

Comments NOTHING