0

result.bad_matches.size()=0の場合でもこのループが実行される理由を知りたい

for (int i = 1; i <= result.badmatches.size() - 1; i++)
{
    ...
}

また、条件badmatchesを使用せずにサイズが0のときに実行を停止する方法は他にありますか?if

4

5 に答える 5

3

これは、size()戻り値のタイプによって異なります。これはおそらく標準のコンテナであるため、符号なしタイプになり、これらのタイプはオーバーフロー時にラップアラウンドします。つまり、1を引いた結果が、そのタイプの最大値になります。

<サイズ( 、 )から減算する必要のない比較を使用する!=か、イテレータまたはfor-autoループを使用します。どのような状況でも、反復には少なくともsize_typeコンテナのネストと同じタイプを使用する必要がありintます。

for(auto& x : result.badmatches) {
 // ...
}
于 2012-10-21T17:10:08.917 に答える
1

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)
{

}
于 2012-10-21T17:12:03.580 に答える
1

while(result.badmatches.size())実行しないために使用 します。

result.badmatches.size()-1これは -1 に変換されます。符号なし整数の場合、-1 は 0xFFFFFFFF (32 ビット マシン上) として解釈されます。これにより、ループが 2^32 回または 2^64 回実行されます。これを回避するには、0 を返すwhile()ことが確実な場合は、前のように使用してください。result.badmatches.size()

于 2012-10-21T17:08:05.437 に答える
0

コレクションのサイズがゼロのときにこのループに入らないようにする場合は、! badmatches.empty()badmatchesがSTLコンテナーであると想定するかどうかを確認できます。ただし、コードの構造を少し変えると、次のようにすることなく、この問題を解決できる可能性があります。

for (size_t i=0; i < result.badmatches.size(); i++)
{
}

を返すのと同じ型(符号なし整数)に変更し、初期値を0に変更し、比較を変更して、次の場合に終了するようにしました。int一般的に、これがインデックス付きの表示の最も明確な方法であると言えます。コレクションの自然なインデックス付けと一致し、ループ内で0、1、2ではなく1、2、3 ...が必要な場合は、その中で対処できます。size_tsize()i >= result.badmatches.size()

それでも問題が解決しない場合は、2つの質問があります。

  1. ループ内にの値を変更する可能性のあるものはありますresult.badmatches.size()か?
  2. コードはマルチスレッド化されてresult.badmatches.size()おり、別のスレッドでのアクションによって変更される可能性がありますか?
于 2012-10-21T17:46:46.743 に答える
0

@Prototype Stark @Aga によって説明された問題を理解した後、私は初期インデックスを 1 に保つことができるより単純な解決策にたどり着きました。

for(int i=1;i+1<=result.badmatches.size();i++)

すべての助けをありがとう、それは今ずっと明確です。

于 2012-10-21T17:52:22.980 に答える