2016-07-06 101 views
1

由于C++数组和向量中的at()函数提供了越界检查,并且在使用operator[]时没有显着的性能差异,是否应该使用括号来访问数组?我应该使用括号[]还是.at()来访问数组?

也许只有在性能关键的代码?

+1

既然你是一个很好的人,你会知道你的指标是否在界限内,并且你不需要向量冗余地检查你。使用方括号。 –

+2

_“使用运算符[]并没有显着的性能差异,而是使用[] [需要的引用] –

回答

5

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

要回答你的问题,下面不支付你不使用,如果你知道你是不会去出界,没有必要使用at()

否则,如果您确定这是一个有效的指针,您应该每次检查一个指针时不要使用nullptr,但实际上您不会这样做。

+0

什么是std :: vector迭代功能?你介意提供一个链接还是进一步描述? –

+0

''头文件提供了几乎所有关于STL容器的函数,而不需要循环遍历一个'std :: vector'并通过索引检索对象。 http://en.cppreference.com/w/cpp/algorithm – Jack

4

当您确定不会出现“越界”访问时,您应该使用[]

你应该使用at()当“出界”访问可以发生,你正在准备或者处理与(通过捕获异常,并做一些合理的),或者你的程序崩溃是确定的(这无论如何都会有你用[],只是以一个未定义的方式)。

2

后来从(i)改变为操作员是相当麻烦的。所以我同意Jesper。

要解决界限问题,您可以要么使用valgrind,要么使用GCC编译时使用-D_GLIBCXX_DEBUG。有关更多信息,请参阅GCC Debug mode

+0

这可能是一种痛苦,但如果你没有这些调试工具,那就更加痛苦了,而选择是通过尝试和解决问题用'at()'替换一些'[]'调用,或花费几个小时调试。 – PaulMcKenzie

+0

使用assert进行边界检查而不是at()会更好吗?由于断言将在发布版本中被删除? –

+0

@ J-Win'assert()'的问题是*在发布版本中被删除。如果该错误仅在发布版本中出现,该怎么办? – PaulMcKenzie

1

我不认为你应该从at()开始,因为我们确信我们的程序没有边界访问问题。因此我们立即开始使用[ ]。然而,如果我们通过SO上的帖子(由通常新的程序员)来访问,关于向量访问的许多问题可以很容易地解决,如果at()被用来检测边界问题。

鉴于此经验,如果怀疑出现界限,或者有暗示可能会出界,请使用at()进行调试。

+2

_“因为我们确信我们的程序没有边界访问问题”_我们是? –

+2

我写了一些讽刺,但好的程序员确实有这种信心。 – PaulMcKenzie

+0

我有信心,我没有那种信心。 –

相关问题