【发布时间】:2021-01-01 03:12:48
【问题描述】:
在 C++ 中,对于向量 v,v.at(x) 的行为类似于 v[x],但如果访问不存在的元素,它会引发越界错误。
我希望始终使用v.at(x),但是写起来不如v[x] 方便。有没有办法让v[x] 表现得像v.at(x),也许使用类似#define 的东西?
如果没有,是否有更好的解决方案来解决总是抛出越界错误?
【问题讨论】:
-
“使用类似
#define的东西”应该永远是你最后的手段。您可能必须为此编写一个自定义容器,因为operator[]不能在类外重载。 -
“[我]有更好的解决越界错误的方法”...?是的,正确验证所有索引。特别是从用户输入派生(或直接来自)的索引。连同代码审查和彻底的单元测试,它应该(理论上)可以解决所有问题。
-
C++ 标准库的一些实现在调试模式下支持边界检查。例如,请参阅 GCC STL bound checking 或 How to make
std::vector'soperator[]compile doing bounds checking in DEBUG but not in RELEASE。 -
我经常使用assert。您可以随意使用它,因为它在发布版本中的运行时开销为零。
-
使用迭代器(以及 C++11 及更高版本)基于范围的循环,有意识地最小化向量索引的使用,并且 - 如果必须使用索引 - 正确验证索引。你会发现有很多情况下向量索引是可以避免的——稍加思考。
标签: c++ c++11 vector indexoutofboundsexception