我应该使用方括号[]还是.at()来访问数组? 由于C++代码和向量中的())/>代码功能提供了越界检查,并且在使用运算符[] /代码>时,没有显著的性能差异,是否应该使用数组访问的括号?< /p>

我应该使用方括号[]还是.at()来访问数组? 由于C++代码和向量中的())/>代码功能提供了越界检查,并且在使用运算符[] /代码>时,没有显著的性能差异,是否应该使用数组访问的括号?< /p>,c++,arrays,C++,Arrays,也许只有在性能关键的代码中才可以使用?您不应该使用它们中的任何一个std::vector提供了迭代功能,很少需要通过索引显式访问项 要回答您的问题,请遵循“不要为您不使用的东西付费”,如果您知道您不会越界,则无需使用at() 否则,每次要取消引用时,都应该检查指针是否为null ptr,但实际上,如果确定它是有效指针,就不会这样做。如果确定不会发生“越界”访问,则应该使用[] 当可能发生“越界”访问时,您应该使用at(),并且您已经准备好处理这个问题(通过捕获异常并做一些合理的事情)或者您的程序

也许只有在性能关键的代码中才可以使用?

您不应该使用它们中的任何一个
std::vector
提供了迭代功能,很少需要通过索引显式访问项

要回答您的问题,请遵循“不要为您不使用的东西付费”,如果您知道您不会越界,则无需使用
at()


否则,每次要取消引用时,都应该检查指针是否为
null ptr
,但实际上,如果确定它是有效指针,就不会这样做。

如果确定不会发生“越界”访问,则应该使用
[]


当可能发生“越界”访问时,您应该使用
at()
,并且您已经准备好处理这个问题(通过捕获异常并做一些合理的事情)或者您的程序崩溃是正常的(如果您使用
[]
,只是以未定义的方式),那么您应该使用

这将在以后从at(i)更改为给接线员打电话很麻烦。因此,我同意杰斯珀的观点


要捕获越界问题,您可以使用valgrind或使用GCC compile with-D_GLIBCXX_DEBUG。有关更多信息,请参阅。

我认为您不应该首先使用
at()
,因为我们确信我们的程序没有边界访问问题。因此,我们立即开始使用
[]

然而,如果我们看一下上面的帖子(通常是新程序员写的),就会发现很多关于向量访问的问题,如果使用
at()
来检测边界问题,这些问题本可以很容易地解决


根据这种经验,当您怀疑自己正在越界时,或者如果有提示您可能正在越界时,请使用
at()
进行调试。

因为您是一个好人,您将知道您的索引是否在范围内,并且不需要向量为您冗余地检查。使用方括号。“使用运算符[]并没有显著的性能差异”[需要引用]什么std::vector迭代功能?你介意提供一个链接或进一步描述吗?
“既然我们确信我们的程序没有边界访问问题”,我们是?我写这篇文章时带着一些讽刺,但是好的程序员确实有这种信心。我有信心我没有那种信心。人们应该总是防御性地编写代码,并表现得好像每一行代码都会出现地狱般的混乱。这可能是一种痛苦,但如果你没有这些调试工具,那就更痛苦了,选择是尝试用
at()
替换一些
[]
调用来解决问题,或者花几个小时进行调试。使用断言进行边界检查比使用at()更好吗?由于断言将在发布版本中删除?@J-Win
assert()
的问题在于它在发布版本中被删除。如果bug只出现在发布版本中呢?好的,那就有意义了。谢谢