如果我想在矢量我可以使用两个选项的值:使用[]运营商。 或者,我可能会使用使用.AT比如函数:
vector<int> ivec;
ivec.push_back(1);
现在,我可以做两件事
int x1 = ivec[0];
int x2 = ivec.at(0); // or
我听说在使用是一个更好的选择,因为当我使用该选项我可以抛出这个异常。
可有人请解释一下吗?
如果我想在矢量我可以使用两个选项的值:使用[]运营商。 或者,我可能会使用使用.AT比如函数:
vector<int> ivec;
ivec.push_back(1);
现在,我可以做两件事
int x1 = ivec[0];
int x2 = ivec.at(0); // or
我听说在使用是一个更好的选择,因为当我使用该选项我可以抛出这个异常。
可有人请解释一下吗?
之间的差c[i]
和c.at(i)
是at()
抛出std::out_of_range
异常,如果i
落在矢量的范围之外,而operator[]
简单地调用未定义的行为,这意味着什么都可能发生。
没有人说, at()
优于operator[]
它只是视情况而定。 由于at()
执行范围检查,可能不希望总是,尤其是当你的代码本身可以确保指数能不会下降的范围之外。 在这种情况下, operator[]
是更好的。
考虑下面的循环:
for(size_t i = 0 ; i < v.size(); ++i)
{
//Should I use v[i] or v.at(i)?
}
在这样的循环中, operator[]
总是在比较的更好的选择, at()
成员函数。
我宁愿at()
时,我希望它抛出异常无效的指数情况下,这样我就可以做的替代工作catch{ ...}
块。 例外帮助你从特殊/替代代码分离正常的代码 :
try
{
size_t i = get_index(); //I'm not sure if it returns a valid index!
T item = v.at(i); //let it throw exception if i falls outside range
//normal flow of code
//...
}
catch(std::out_of_range const & e)
{
//alternative code
}
在这里,你可以检查i
自己,以确保它是有效的索引,然后调用operator[]
,而不是at()
但使用它会与替代代码混合正常码if-else
块,这使得它很难读取的代码的正常流动 。 如果你看到上面try-catch
提高了代码的可读性,因为它确实在替代码分离正常码,导致整洁的代码。
之间的唯一区别at
和[]
是at
执行范围检查,并且[]
没有。 如果检查的范围已经或已构建索引以这样一种方式,它无法脱身的范围内,并需要多次访问某个项目,你可以通过选择保存几个CPU周期[]
而不是一个at
。
单个检查和多址接入的实施例:
size_t index = get_index(vect);
if (index < 0 || index >= vect.size()) return;
if (vect[index] > 0) {
// ....
} else if (vect[index] > 5) {
// ....
} else ....
当索引构造的情况的示例是内部限制:
for (size_t i = 0 ; i != vect.size() ; i++) {
if (vect[i] > 42) {
// ....
}
}
其他答案是完全正确的,但给人的印象,这是一个好主意,用at()
编写代码,你仍然会调试,因为这将导致信号错误时。 这是一般的情况,但并不适用于最广泛的编译器- GCC可以设置为执行(致命)的范围检查, 把它在调试模式和类似大概可以在Visual Studio中做了什么。
矢量方法C ++ .at
检查边界因此当元件不存在于载体中存在和out_of_range
抛出异常。
当使用[]
为界没有检查的矢量进行,因此,如果该元素不存在不会抛出异常,其结果是像具有在载体中无exeisting elemnts的随机值的未定义的行为。
使用[]
优于at
安全的长期然而这将需要更多的时间,并在程序的perfermance的影响。