我知道这at()
比[]
它的边界检查要慢,因为边界检查也有类似的问题,例如C ++ Vector at / []运算符速度 或:: std :: vector :: at()vs :: [] <<令人惊讶的结果!慢/快5到10倍!。我只是不明白该at()
方法有什么用。
如果我有一个像这样的简单向量:std::vector<int> v(10);
并且我决定通过使用at()
而不是[]
在有索引的情况下使用in 来访问其元素,i
并且不确定其是否在向量范围内,它将迫使我用try-catch包装它块:
try
{
v.at(i) = 2;
}
catch (std::out_of_range& oor)
{
...
}
尽管我可以自己使用size()
和检查索引来获得相同的行为,但对我来说似乎更容易也很方便:
if (i < v.size())
v[i] = 2;
所以我的问题是:与vector :: operator []
相比,使用vector :: at有什么优点?
什么时候应该使用vector :: at而不是vector :: size + vector :: operator []?
if (i < v.size()) v[i] = 2;
,有一个可能的代码路径根本没有分配2
给的任何元素v
。如果那是正确的行为,那就太好了。但是,当when时,此功能通常没有任何意义i >= v.size()
。因此,没有特殊的原因为什么它不应该使用异常来指示意外情况。许多功能只是在使用时operator[]
不检查大小,i
必须在范围内的文档,并且将生成的UB归咎于调用者。