在编程时,我发现我在使用条件i + 1< vec.size()
时代码给出了运行时错误,但在vec
上运行正常。
这里std::vector
是空的//giving error
vector<int> vec;
for (int i = 0; i < vec.size() - 1; i++)
{
//some code
}
//not giving error
vector<int> vec;
for (int i = 0; i + 1 < vec.size(); i++)
{
//some code
}
。
Inductive nostutter {X:Type} : list X -> Prop :=
| ns_nil : nostutter []
| ns_one : forall (x : X), nostutter [x]
| ns_cons: forall (x : X) (h : X) (t : list X), nostutter (h::t) -> x <> h -> nostutter (x::h::t).
Example test_nostutter_4: not (nostutter [3;1;1;4]).
Proof.
intro.
repeat match goal with
h: nostutter _ |- _ => inversion h; clear h; subst
end.
contradiction.
Qed.
答案 0 :(得分:13)
方法std::vector::size
返回一个未签名的std::size_t
。因此,如果为空,您将得到0 - 1
,但表示为无符号数字,该数字将下溢并根据two's complement变为18446744073709551615
。
答案 1 :(得分:4)
侧注。比较有符号和无符号数字不是一个好主意。在C ++ 20中,我们将有一个新函数std::ssize
,该函数返回带符号的类型。然后您的示例写为
for (std::ptrdiff_t i = 0; i < std::ssize(vec) - 1; ++i)
{
//some code
}
将完全有效。
还要注意如何将i
声明为std::ptrdiff_t
(带符号整数类型)以指示数组索引。