我应该使用括号 [] 还是 .at() 进行数组访问

Should I use brackets [] or .at() for array access?

本文关键字:访问 数组 at 还是 我应该      更新时间:2023-10-16

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

也许只在性能关键型代码中?

当您确定不会发生"越界"访问时,您应该使用[]

当可能发生"越界"访问并且您准备处理它(通过捕获异常并执行一些明智的操作)或程序崩溃是可以的(无论如何,如果您使用[],只是以未定义的方式),您应该使用at())。

您还可以在开发(或调试)应用程序时临时使用 .at(),以便更轻松地调试越界访问(因为您将获得异常,而不仅仅是未定义的行为),并且通常您不太关心初始开发和测试期间的轻微性能影响。然后,当您确定调用正确且实际上不需要进一步调试它们时,可以将调用从.at()切换到operator[]

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

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

否则,每次要取消引用指针时,都应始终检查指针是否未nullptr,但实际上,如果您确定它是有效的指针,则不会这样做。

后来

从at(i)更改为运算符是相当麻烦的。因此,我同意杰斯珀的观点。

为了捕捉越界问题,你可以使用valgrind,或者如果你使用GCC编译-D_GLIBCXX_DEBUG。有关详细信息,请参阅 GCC 调试模式。

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

但是,如果我们浏览SO上的帖子(通常是新程序员),则有许多关于矢量访问的问题,如果使用at()来检测边界问题,这些问题本可以轻松解决。

鉴于此经验,当您怀疑自己越界时,或者有迹象表明您可能越界时,请使用 at() 进行调试。