由于C++数组和向量中的at()
函数提供了越界检查,并且在使用operator[]
时没有显着的性能差异,是否应该使用括号来访问数组?我应该使用括号[]还是.at()来访问数组?
也许只有在性能关键的代码?
由于C++数组和向量中的at()
函数提供了越界检查,并且在使用operator[]
时没有显着的性能差异,是否应该使用括号来访问数组?我应该使用括号[]还是.at()来访问数组?
也许只有在性能关键的代码?
你不应该使用它们中的任何一个。 std::vector
提供了迭代功能,这些功能很少通过索引显式访问项目。
要回答你的问题,下面不支付你不使用,如果你知道你是不会去出界,没有必要使用at()
。
否则,如果您确定这是一个有效的指针,您应该每次检查一个指针时不要使用nullptr
,但实际上您不会这样做。
什么是std :: vector迭代功能?你介意提供一个链接还是进一步描述? –
'
当您确定不会出现“越界”访问时,您应该使用[]
。
你应该使用at()
当“出界”访问可以发生,你正在准备或者处理与(通过捕获异常,并做一些合理的),或者你的程序崩溃是确定的(这无论如何都会有你用[]
,只是以一个未定义的方式)。
后来从(i)改变为操作员是相当麻烦的。所以我同意Jesper。
要解决界限问题,您可以要么使用valgrind,要么使用GCC编译时使用-D_GLIBCXX_DEBUG。有关更多信息,请参阅GCC Debug mode。
这可能是一种痛苦,但如果你没有这些调试工具,那就更加痛苦了,而选择是通过尝试和解决问题用'at()'替换一些'[]'调用,或花费几个小时调试。 – PaulMcKenzie
使用assert进行边界检查而不是at()会更好吗?由于断言将在发布版本中被删除? –
@ J-Win'assert()'的问题是*在发布版本中被删除。如果该错误仅在发布版本中出现,该怎么办? – PaulMcKenzie
我不认为你应该从at()
开始,因为我们确信我们的程序没有边界访问问题。因此我们立即开始使用[ ]
。然而,如果我们通过SO上的帖子(由通常新的程序员)来访问,关于向量访问的许多问题可以很容易地解决,如果at()
被用来检测边界问题。
鉴于此经验,如果怀疑出现界限,或者有暗示可能会出界,请使用at()
进行调试。
既然你是一个很好的人,你会知道你的指标是否在界限内,并且你不需要向量冗余地检查你。使用方括号。 –
_“使用运算符[]并没有显着的性能差异,而是使用[] [需要的引用] –