访问可能不存在的const vector成员- try/catch或if (count != 0)

C++: Accessing possibly non-existent const vector member - try/catch or if (count != 0)?

本文关键字:if catch count try 不存在 const 成员 vector 访问      更新时间:2023-10-16

我想将vector成员的副本赋值给另一个变量,如果该成员存在。如果没有,那么就不应该分配任何任务。不得对vector进行任何更改。

我可以采用try/catch方法,或者if(exists)/do方法。有理由更喜欢其中一种吗?即给定

const vector<int> v = {}; // or maybe {1, 2, 5}
int myInt;

传统的条件方法:

if (v.size() >= 2)
{
    myInt = v.at(1);
    // or myInt = v[1];
}

Try/catch:

try
{
    myInt = v.at(1);
}
catch(std::out_of_range)
{
}

这主要取决于您自己对异常的看法。(在我看来)通常赋予它们的属性是"例外应该是例外"。

如果在正常执行中抛出异常,只是因为你不想写存在性检查,那么这将与上面的语句相反。

这样做的主要原因是堆栈展开并不总是那么便宜。不过,vector::at可能是内联的,没有堆栈需要展开。也许编译器甚至把这个异常优化掉了。

如果你在调试一般的向量访问,它可能仍然是一个麻烦。例如,如果您想捕获所有out_of_bounds异常以跟踪一条不可描述的错误消息,那么如果您在正常操作期间继续抛出这些异常,将会更加困难。

在你的例子中,这取决于"如果没有赋值"的结果。

试图访问v[1]的代码是否可以适当地处理v.size()1或更少?例如,通过在现场调整v的大小,为变量提供一些默认值。在这种情况下,没有必要抛出异常——调用者甚至不需要为潜在的错误条件而烦恼,因为它将被纠正。

您的代码是否无法更正v.size()1或更小,但调用者能够恢复的可能性是合理的?如果可以合理地期望调用者进行检查和恢复,那么返回代码是合适的(不需要抛出异常)。类似地,如果发生错误但不进行检查,调用者可以合理地继续正常运行,那么返回代码也是合适的。如果不能合理地期望调用方恢复,或者调用方可以恢复,但不能依赖它来检查错误条件,那么最好抛出一个异常——要么强制调用方处理错误,要么终止调用。