为什么在C ++中使用“vector.at(X)”比“矢量[X]”更好?(Why is using

2019-06-25 17:19发布

如果我想在矢量我可以使用两个选项的值:使用[]运营商。 或者,我可能会使用使用.AT比如函数:

vector<int> ivec;
ivec.push_back(1);

现在,我可以做两件事

int x1 = ivec[0];
int x2 = ivec.at(0); // or

我听说在使用是一个更好的选择,因为当我使用该选项我可以抛出这个异常。

可有人请解释一下吗?

Answer 1:

之间的差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提高了代码的可读性,因为它确实在替代码分离正常码,导致整洁的代码。



Answer 2:

之间的唯一区别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) {
        // ....
    }
}


Answer 3:

其他答案是完全正确的,但给人的印象,这是一个好主意,用at()编写代码,你仍然会调试,因为这将导致信号错误时。 这是一般的情况,但并不适用于最广泛的编译器- GCC可以设置为执行(致命)的范围检查, 把它在调试模式和类似大概可以在Visual Studio中做了什么。



Answer 4:

矢量方法C ++ .at检查边界因此当元件不存在于载体中存在和out_of_range抛出异常。

当使用[]为界没有检查的矢量进行,因此,如果该元素不存在不会抛出异常,其结果是像具有在载体中无exeisting elemnts的随机值的未定义的行为。

使用[]优于at安全的长期然而这将需要更多的时间,并在程序的perfermance的影响。



文章来源: Why is using “vector.at(x)” better than “vector[x]” in C++?