访问可能不存在的const vector成员- try/catch或if (count != 0)
C++: Accessing possibly non-existent const vector member - try/catch or if (count != 0)?
我想将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
或更小,但调用者能够恢复的可能性是合理的?如果可以合理地期望调用者进行检查和恢复,那么返回代码是合适的(不需要抛出异常)。类似地,如果发生错误但不进行检查,调用者可以合理地继续正常运行,那么返回代码也是合适的。如果不能合理地期望调用方恢复,或者调用方可以恢复,但不能依赖它来检查错误条件,那么最好抛出一个异常——要么强制调用方处理错误,要么终止调用。
- 我的简单if-else语句是如何无法访问的代码
- 如何将enable-if与模板参数和参数包一起使用
- 无论条件是否为true,if总是在c++中执行
- Arduino:for/while/if在void setup()或void loop()之前?——错误:之前需要不合格
- Insert函数不适用于2 if语句C++
- If语句未被求值C++
- C++嵌套if语句,基本货币交换
- 多个If语句与使用逻辑运算符计算条件的单个语句的比较
- 是否可以使用if constexpr删除控制流语句
- 要与"if constexpr"一起使用的编译时消息(在预处理器之后)
- 如何删除peer if else分支中的冗长句子
- 为什么catch中的代码没有被执行
- 我似乎对if/else的基本语句有问题:/
- if数组上的随机数
- 将按位if条件转换为普通if条件
- If语句在c++中被忽略
- "if"、"while"、'catch' 等之后的空格。使用叮当格式
- 使用try-Catch异常处理程序和if-else条件检查之间的区别
- 访问可能不存在的const vector成员- try/catch或if (count != 0)
- c++从文件中读取:使用.fail()或try/catch的if条件