应该在std :: vector或std :: array的[]上使用.at()吗?

时间:2019-03-28 18:42:37

标签: c++ c++11 vector containers

这与this post有关,后者讨论了$*中的.at()与[]。我只想问一下是否应在括号运算符上使用std::vector?以下面的代码示例:

.at()

我不会以这种方式打印矢量,我会使用#include <vector> #include <iostream> void print(const std::vector<int> &v) { for(int i = 0; i < v.size(); ++i) { std::cout << v.at(i) << " "; } std::cout << std::endl; } int main() { std::vector<int> test = {1,2,3,4}; print(test); } 并打印出每个元素,因为可以保证不会超出矢量的范围。但是,让我们说一会儿,我们正在教新学生学习for循环。

假设我们将for循环中的第二个参数更改为for(const auto &e : v)v.size() + 1将崩溃,并给我们带来有意义的运行时错误.at(i)。但是,如果我们将std::out_of_range更改为.at(i),则程序可以正常运行并为我打印出一个额外的数字。我正在Windows的Ubuntu 18.04上运行此程序,我以为该程序在执行该操作时将崩溃,但没有执行该操作。

问题来了,访问容器时,我们应该使用v[i]而不是.at()吗?

1 个答案:

答案 0 :(得分:4)

  

应在.std :: vector或std :: array的[]上使用.at()吗?

是的,如果

  • 您无法证明您访问的索引在范围之内。
  • 您不想证明这一点。
  • 您可能会在证明或实现中犯错(对人类来说,大多数情况下,这是“肯定的”),并且程序中未定义的行为比at的开销要昂贵。 / li>

否,如果

  • 您负担不起at的开销。

这没关系

  • 您的程序不适用于不确定的行为可能导致信息丢失(或泄漏),任何货币价值,生命等的情况。
  

让我们等一下,我们正在教新学生

使用at对于尚未开发出推理程序正确性的新学生特别有用。

另一方面,了解未定义的行为对于C ++程序员也是必不可少的,向量下标及其警告也需要向学生介绍……稍后,在他们已经熟悉向量的情况下。