这与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()
吗?
答案 0 :(得分:4)
应在.std :: vector或std :: array的[]上使用.at()吗?
是的,如果
at
的开销要昂贵。 / li>
否,如果
at
的开销。这没关系
让我们等一下,我们正在教新学生
使用at
对于尚未开发出推理程序正确性的新学生特别有用。
另一方面,了解未定义的行为对于C ++程序员也是必不可少的,向量下标及其警告也需要向学生介绍……稍后,在他们已经熟悉向量的情况下。