result.bad_matches.size()=0の場合でもこのループが実行される理由を知りたい
for (int i = 1; i <= result.badmatches.size() - 1; i++)
{
...
}
また、条件badmatches
を使用せずにサイズが0のときに実行を停止する方法は他にありますか?if
result.bad_matches.size()=0の場合でもこのループが実行される理由を知りたい
for (int i = 1; i <= result.badmatches.size() - 1; i++)
{
...
}
また、条件badmatches
を使用せずにサイズが0のときに実行を停止する方法は他にありますか?if
これは、size()
戻り値のタイプによって異なります。これはおそらく標準のコンテナであるため、符号なしタイプになり、これらのタイプはオーバーフロー時にラップアラウンドします。つまり、1を引いた結果が、そのタイプの最大値になります。
<
サイズ( 、 )から減算する必要のない比較を使用する!=
か、イテレータまたはfor-autoループを使用します。どのような状況でも、反復には少なくともsize_type
コンテナのネストと同じタイプを使用する必要がありint
ます。
for(auto& x : result.badmatches) {
// ...
}
sizeはunsignedを返す必要があるため、0-1はunsignedにアップグレードされ、左の値もアップグレードされます。したがって、intサイズが4バイトの場合、-1はunsignedintでは2^32-1として表されます。
この動作が必要ない場合は、次のようにキャストします。static_cast <signed int>(result.badmatches.size());
PS:私は過去4年間C++に触れていません。ちょっとした間違いを許してください。
正しい方法は次のとおりです。
for (int i=0;i< result.badmatches.size() ;++i)
{
}
while(result.badmatches.size())
実行しないために使用 します。
result.badmatches.size()-1
これは -1 に変換されます。符号なし整数の場合、-1 は 0xFFFFFFFF (32 ビット マシン上) として解釈されます。これにより、ループが 2^32 回または 2^64 回実行されます。これを回避するには、0 を返すwhile()
ことが確実な場合は、前のように使用してください。result.badmatches.size()
コレクションのサイズがゼロのときにこのループに入らないようにする場合は、! badmatches.empty()
badmatchesがSTLコンテナーであると想定するかどうかを確認できます。ただし、コードの構造を少し変えると、次のようにすることなく、この問題を解決できる可能性があります。
for (size_t i=0; i < result.badmatches.size(); i++)
{
}
を返すのと同じ型(符号なし整数)に変更し、初期値を0に変更し、比較を変更して、次の場合に終了するようにしました。int
一般的に、これがインデックス付きの表示の最も明確な方法であると言えます。コレクションの自然なインデックス付けと一致し、ループ内で0、1、2ではなく1、2、3 ...が必要な場合は、その中で対処できます。size_t
size()
i >= result.badmatches.size()
それでも問題が解決しない場合は、2つの質問があります。
result.badmatches.size()
か?result.badmatches.size()
おり、別のスレッドでのアクションによって変更される可能性がありますか?@Prototype Stark @Aga によって説明された問題を理解した後、私は初期インデックスを 1 に保つことができるより単純な解決策にたどり着きました。
for(int i=1;i+1<=result.badmatches.size();i++)
すべての助けをありがとう、それは今ずっと明確です。