我想知道为什么即使 result.bad_matches.size()=0 也会运行这个循环
for (int i = 1; i <= result.badmatches.size() - 1; i++)
{
...
}
另外,有没有其他方法可以在badmatches
不使用if
条件的情况下阻止它在大小为 0 时运行?
我想知道为什么即使 result.bad_matches.size()=0 也会运行这个循环
for (int i = 1; i <= result.badmatches.size() - 1; i++)
{
...
}
另外,有没有其他方法可以在badmatches
不使用if
条件的情况下阻止它在大小为 0 时运行?
这取决于size()
返回的类型。它可能是一个标准容器,因此将是一个无符号类型,并且这些类型会在溢出时环绕。这意味着减一的结果将是该类型的最大值。
要么使用不需要从大小中减去的比较(<
, !=
),要么只使用迭代器或 for-auto 循环。在任何情况下,您至少应该使用与嵌套size_type
容器相同的类型进行迭代,而不是int
.
for(auto& x : result.badmatches) {
// ...
}
用于 while(result.badmatches.size())
不执行它。
result.badmatches.size()-1
这将被转换为 -1。如果它是无符号整数,则 -1 被解释为 0xFFFFFFFF(在 32 位机器上)。这将使循环运行 2^32 或 2^64 次。为避免这种情况,while()
请像以前一样使用如果您确定result.badmatches.size()
将返回 0。
size 必须返回一个无符号的,因此 0-1 被升级为无符号,左值也是如此。因此对于 4 字节的 int 大小,-1 将在 unsigned int 中表示为 2^32 -1。
如果您不想要这种行为,那么只需像这样进行转换:static_cast <signed int > (result.badmatches.size());
PS:过去 4 年我没有接触过 C++。原谅小错误。
正确的方法是:
for (int i=0;i< result.badmatches.size() ;++i)
{
}
如果您特别不希望在集合的大小为零时进入此循环,那么您可以检查是否! badmatches.empty()
假设 badmatches 是一个 STL 容器。但是,如果您的代码结构略有不同,您可能无需这样做就可以克服这个问题:
for (size_t i=0; i < result.badmatches.size(); i++)
{
}
我已经将返回的类型更改int
为size_t
相同的类型size()
(无符号整数),将初始值更改为 0 并进行比较,以便它退出i >= result.badmatches.size()
通常情况下,我会说这是呈现索引的最清晰的方式方法,因为它匹配集合的自然索引,如果您在循环中需要 1、2、3 ... 而不是 0、1、2,那么您可以在其中解决这个问题。
如果您仍然遇到问题,请提出两个问题:
result.badmatches.size()
?result.badmatches.size()
可能会因另一个线程上的操作而改变?在理解了@Prototype Stark @Aga 解释的问题之后,我找到了一个更简单的解决方案,使用它我可以将初始索引保持为 1 。
for(int i=1;i+1<=result.badmatches.size();i++)
谢谢大家的帮助,现在清楚多了。