我应该在我的代码中使用std :: vector :: at()

lau*_*ent 16 c++ optimization vector bounds

我今天注意到,这std::vector::at()比使用方括号访问值要慢得多[].根据doc .at()更安全,因为它不会让我访问超出数组边界的值.但是,即使我访问了超出绑定的值at(),我显然仍会有错误,所以无论如何我都需要避免这种情况.

那么为什么有人会使用at()而不是[]

Ker*_* SB 20

如果您有理由相信索引不在您的控制之下,或者控制流程特别复杂并且您正在跟踪错误,那么您可能希望at()在调试阶段使用,但从不在内部循环或任何情况下您知道指数是安全的.

即使在其他情况下,您应该预先验证索引(例如,如果它是用户输入),或者如果您只是从复杂算法中获取值,请使用assert并修复错误(如果有).[编辑.]或者如果您正在编写一个非常复杂的算法并且您不确定所有索引是否始终有效,您可以at()在该算法中使用并将调用放入try块 - 但即使在这里它也是可取的冒犯并使用断言.[/]

就个人而言,我看不出有任何充分的理由at()可以存活到发布代码中.你可以设想一些你希望使用异常处理作为指导控制流的方便方法的例子,但任何这样的用例都是非常情境化的.

  • 我不是downvoter(并且不认为答案应该是一个downvote)但是考虑到[]的唯一优势是速度,如果速度在你写的函数中基本上无关紧要,我更喜欢在()使用.我们的代码设置方式,我们从哪个模块中记录异常,因此通过使用at()可以更容易/更快地解决我们或QA在全新模块和功能中常见的愚蠢错误. (4认同)

mka*_*aes 9

at()和之间的区别在于,通过抛出out_of_range异常operator[]来表示at()请求的位置是否超出范围.
因此,at()您可以对错误状态做出反应.使用operator []从索引中访问向量将导致未定义的行为.

  • 正确的说法是"访问越界索引会导致未定义的行为". (3认同)