我应该使用括号 [] 还是 .at() 进行数组访问
Should I use brackets [] or .at() for array access?
由于C++数组和向量中的at()
函数提供了越界检查,并且使用operator[]
没有显着的性能差异,因此是否应该使用括号进行数组访问?
也许只在性能关键型代码中?
当您确定不会发生"越界"访问时,您应该使用[]
。
当可能发生"越界"访问并且您准备处理它(通过捕获异常并执行一些明智的操作)或程序崩溃是可以的(无论如何,如果您使用[]
,只是以未定义的方式),您应该使用at()
)。
您还可以在开发(或调试)应用程序时临时使用 .at()
,以便更轻松地调试越界访问(因为您将获得异常,而不仅仅是未定义的行为),并且通常您不太关心初始开发和测试期间的轻微性能影响。然后,当您确定调用正确且实际上不需要进一步调试它们时,可以将调用从.at()
切换到operator[]
。
你不应该使用它们中的任何一个。 std::vector
提供的迭代功能很少需要按索引显式访问项。
要回答您的问题,请遵循 不要为您不使用的东西付费,如果您知道您不会越界,则无需使用 at()
.
否则,每次要取消引用指针时,都应始终检查指针是否未nullptr
,但实际上,如果您确定它是有效的指针,则不会这样做。
从at(i)更改为运算符是相当麻烦的。因此,我同意杰斯珀的观点。
为了捕捉越界问题,你可以使用valgrind,或者如果你使用GCC编译-D_GLIBCXX_DEBUG。有关详细信息,请参阅 GCC 调试模式。
我认为您不应该从使用 at()
开始,因为我们相信我们的程序没有边界访问问题。 因此,我们立即开始使用[ ]
。
但是,如果我们浏览SO上的帖子(通常是新程序员),则有许多关于矢量访问的问题,如果使用at()
来检测边界问题,这些问题本可以轻松解决。
鉴于此经验,当您怀疑自己越界时,或者有迹象表明您可能越界时,请使用 at()
进行调试。
- 在 C++ 中访问数组负索引处的内存不会返回垃圾
- 使用指针访问数组中的对象数据成员
- VTK 图像数据,访问数组中的 1 个图像
- 调用函数后无法访问数组
- 如何从地图访问数组的元素?
- 访问数组中的不同元素
- 使用指针访问数组元素时出现意外结果
- 使用指针访问数组的值
- C++基于1而不是0的访问数组,方法是在编译时移位
- 如何在主函数之外访问数组?
- 如何在 llvm 的 cpp api 中使用 CreateInBoundsGEP 来访问数组的元素?
- 访问数组中所有结构的成员
- C 是否每次访问数组时都复制元素?
- C++ 为什么访问数组中的元素会返回指针?
- 如何通过指针访问数组的元素
- 指针数组交换无需直接访问数组
- 直接从指针/地址访问数组的元素
- 我有一个 Qt 对象的 2d 数组,我已经用值播种了这些对象。如何访问数组中特定对象的值并更改它们?
- 如何使用 C+ 中的指针访问数组中的特定索引
- 通过两个下标访问数组成员