c++ - 为什么在 C++ 中使用 "vector.at(x)"比使用 "vector[x]"更好?

标签 c++ exception vector

如果我想获得 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/

相关文章:

java - 重写方法不抛出任何异常时的异常处理

java - Tomcat 应用程序日志未显示完整堆栈跟踪

c++ - 为什么我的编译器对 c 字符串类型的 vector 有内存问题?

c++ - 带有可选图形用户界面的 Qt 应用程序

c++ - 使用流运算符将具有整数值的类保存到二进制文件中 >>/<<

c++ - 在 C++03 中是否可以使用非 const 右值引用?

c++ - 删除除 'largest' 之外的所有 vector 元素

c++ - 如何在 configure.in 中测试 C++ 库的可用性?

c# - KeyNotFoundException 与在线数据库

c++ - 查找 vector 中最接近的值