由于C ++数组和向量中的at()
函数提供了越界检查,并且使用operator[]
时没有显着的性能差异,是否应该使用括号进行数组访问? / p>
也许只在性能关键代码中?
答案 0 :(得分:5)
你不应该使用它们中的任何一个。 std::vector
提供了几乎不需要通过索引显式访问项目的迭代功能。
要回答您的问题,在为您不使用的内容付费后,如果您知道自己不会出界,则无需使用at()
。
否则你每次要取消引用时都应该检查指针是否为nullptr
,但实际上如果你确定它是一个有效的指针,你就不会这样做
答案 1 :(得分:4)
当您确定没有"越界"时,您应该使用[]
访问将会发生。
当"越界时,你应该使用at()
"访问可能发生,你准备要么处理(通过捕获异常并做一些合理的事情)或者你的程序崩溃是正常的(无论如何你使用[]
,只是以一种不确定的方式)。
答案 2 :(得分:2)
后来从(i)变为运营商是一件非常麻烦的事。因此我同意Jesper的意见。
为了捕捉越界问题,您可以例如要么使用valgrind,要么使用GCC编译-D_GLIBCXX_DEBUG。有关详细信息,请参阅GCC Debug mode。
答案 3 :(得分:1)
我认为您应该首先使用at()
,因为我们相信我们的计划不会遇到边界访问问题。因此,我们立即开始使用[ ]
。
但是,如果我们通过SO上的帖子(通常是新的程序员),那么有很多关于矢量访问的问题,如果使用at()
来检测边界问题,那么这些问题很容易解决。
鉴于此经验,当您怀疑自己越界时,或者如果有提示您可能超出界限时,请使用at()
进行调试。