【发布时间】:2019-03-28 18:42:36
【问题描述】:
这与this post 相关,std::vector 中谈到了 .at() 与 []。我只想问是否应该在括号运算符上使用.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(const auto &e : v) 并打印出每个元素,因为这保证不会超出向量的范围。但是,假设我们正在向新生教授 for 循环。
假设我们将 for 循环中的第二个参数更改为 v.size() + 1。 .at(i) 将崩溃并给我们一个有意义的运行时错误std::out_of_range。但是,如果我们将.at(i) 更改为v[i],程序运行良好并为我打印出一个额外的数字。我在 Window 上的 Ubuntu 18.04 上运行它,我认为当我这样做时程序会崩溃,但事实并非如此。
那么问题来了,我们是否应该在访问容器时使用.at() 而不是[]?
【问题讨论】:
-
但是,让我们先说一下我们正在教新学生有关 for 循环的知识。 从基于范围的 for 循环开始他们,并在他们更舒服时将旧循环留到以后。
-
您自己提供的链接中究竟有什么不清楚的地方?我不知道如何在已经那里添加任何内容。
-
@Sailanarmo 在我们生活的方方面面(包括软件开发)中,始终以安全为代价换取可用性。投资时,你想要更低的风险还是更高的回报?
-
@DrPhil 我的意见是,如果性能对你来说并不重要,你可能应该使用不同的语言。
标签: c++ c++11 vector containers