0
for (int i = 0 ; i < stlVector.size() ; i++)
{ 
    if (i == 10)
    { 
        stlVector.erase(stlVector.begin() + 5 )
    }
}

終了条件部分「stlVector.size()」は「stlVector.erase(...)」を考慮していますか?つまり、 stlVector. size() はループの繰り返しごとに更新されますか? 今はテストできないので、ここに質問を投稿しました。

事前にt​​hx!

よろしくお願いします、

正統派

4

9 に答える 9

5

明確にするために、ループが何かを更新するという観点から考えないでください。条件がチェックされるたびに (ループの開始時に)、stlVector 変数に対して size() メソッドが呼び出され、ベクターの現在のサイズが返されます。

erase() メソッドはベクトルのサイズを縮小するため、次に size() が呼び出されたときに返される値は小さくなります。

于 2009-02-12T16:22:48.023 に答える
4

はい、そうです!

stlVector.size () // is called for evey iteration

したがって、ループごとに、テスト「i <stlVector.size()」を再評価する必要があります。

于 2009-02-12T16:13:55.707 に答える
4

はい、テストは各ループに対して副作用を伴って実行されます。

forループは、単なる優れた規則です。forループは、whileループとして簡単に分解できます。

for (int i = 0 ; i < stlVector.size() ; i++)
{ 
    if (i == 10)
    { 
        stlVector.erase(stlVector.begin() + 5 )
    }
}

になる:

int i = 0 ;

while(i < stlVector.size())
{ 
    if (i == 10)
    { 
        stlVector.erase(stlVector.begin() + 5 )
    }
    i++;
}

-アダム

于 2009-02-12T16:14:27.030 に答える
3

はい、そうですが、これはしないでください!ベクトルから要素を削除する場合は、別のループ内で実行します。この場合、iインデックスの後の要素を削除しています。stlVector[i+5]要素が存在することを保証するものは何もありません。ベクトルからi番目の要素を削除すると、要素をチェックせずにジャンプできるため、カウントが壊れます。

これを行う最も安全な方法は、削除する要素の参照を別のベクトルでstlVectorに格納してから、stlVector.erase(auxVector [i])を実行してこの補助ベクトルを反復処理することです。

于 2009-02-12T16:29:05.217 に答える
2

必ず再評価!

于 2009-02-14T11:01:53.677 に答える
2

あなたが提供したコードは、あなたがやろうとしていることの具体的な例を示すために、(あるコメンターが言ったように)単なる「ファンタジーコード」であると思います。

ただし、そうでない場合に備えて:指定したループは 12 番目の要素(つまり、元の要素)をスキップしますstlVector[11]。これは、調べるときstlVector[10]に以前の要素を削除すると、後のすべての要素が 1 位置前にシャントするためですがi、最後にインクリメントするためです。ループの。したがって、次の反復stlVector[11]では、実際には元々 にあった要素がどれであるかを調べますstlVector[12]。これを解決するに--iは、 への呼び出しの後にする必要がありますerase()

于 2009-02-13T08:11:31.333 に答える
1

また、「VC ++ 6で」このように行うかどうかを尋ねたので、少し明確にするために。

「継続条件」は、C、C++、C#、および Java のすべてのバージョンのすべてのループで再評価されます。

コンパイラがそれを行うコードを生成しない場合、それは壊れているため、回避する必要があります。

于 2009-02-12T16:33:21.213 に答える
1

他の人が言ったように、はい、条件はループのたびに再評価されます。そのため、一般的なパフォーマンスの最適化は次のとおりです。

int saveSize = someExpensiveComputation();

for (int i = 0 ; i < saveSize ; i++)
{ 
    foo(i);
}

ループ条件の計算にはまったくコストがかかりますが、代わりに

for (int i = 0 ; i < someExpensiveComputation(); i++)
{ 
    foo(i);
}

コストのかかる計算がループの各反復で不必要に行われる場合。

于 2009-02-12T16:40:25.657 に答える
0

はい、サイズが小さくなります。詳細はこちら

于 2009-02-12T16:14:49.900 に答える