如果我想获得 vector 中的一个值,我可以使用两个选项:使用 [] 运算符。或者我可以使用函数 .at 示例来使用:
vector<int> ivec;
ivec.push_back(1);
现在我可以同时做这两件事
int x1 = ivec[0];
int x2 = ivec.at(0); // or
我听说使用 at 是一个更好的选择,因为当我使用该选项时,我可以将它抛出异常。
有人可以解释一下吗?
最佳答案
c[i]
和c.at(i)
的区别在于at()
如果 i
超出 vector 范围,则抛出 std::out_of_range
异常,而 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
block 将普通代码与替代代码混合在一起,这使得正常的代码流难以阅读。如果您在上面看到,try-catch
提高了代码的可读性,因为它真正将正常代码与替代代码分开,从而产生整洁干净的代码。
关于c++ - 为什么在 C++ 中使用 "vector.at(x)"比使用 "vector[x]"更好?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11172144/