VC ++ 6の「ループのための」リフレッシュの終了条件をしていますか?
-
23-08-2019 - |
質問
for (int i = 0 ; i < stlVector.size() ; i++)
{
if (i == 10)
{
stlVector.erase(stlVector.begin() + 5 )
}
}
い、終了条件部 "stlVector.size()" 取る "stlVector.erase(...)" 考慮?他の言葉ではstlVector.size()は、すべてのループ反復のためにリフレッシュしていますか? 私は今、それをテストすることはできませんので、私はここに質問を投稿しました。
事前にThxを!
敬具、
zhengtonic
解決
ただ、明確にするために、何をリフレッシュループの観点からそれを考えていません。条件(ループを通して各時間の開始時に)検査されるたびに、サイズ()メソッドがstlVector変数で呼び出され、ベクトルの現在のサイズが返されます。
消去()メソッドは、ベクトルの大きさを減少させるので、次回のサイズ()が呼び出され、返される値は小さくなります。
他のヒント
はい、それはありません!
stlVector.size () // is called for evey iteration
このように、あなたがテストを持っていますすべてのforループを再評価する "私はstlVector.sizeは()<"!
はい、試験は各ループのために、副作用が、実行される。
forループAは素晴らしい大会にすぎない - ループのための簡単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++;
}
-Adam
はい、それはありませんが、これをしません!あなたはベクターから要素を削除したい場合は、別のループ内でそれを行います。この場合、私のインデックスの後の要素を削除する:何もstlVector [I + 5]の要素が存在することを保証しません。あなたは、ベクターからのi番目の要素を削除する場合は、あなたがそれらをチェックせずに要素をジャンプすることができますので、あなたのカウントが壊れてます。
これを行うための最も安全な方法は、あなたが別のベクトルに削除したいstlVector上の要素の参照を格納し、その後stlVector.eraseやってこのAUXILIARベクトルに反復される(auxVectorを[I])。
私はあなたが提供したコードは、あなたがしようとしているものの種類の具体的な例を与えるために(1つのコメンターがそれを置くように)単に「幻想コード」で期待しています。
しかし念のためにそうではありません。あなたがたのループは、12日の要素をスキップしますの(すなわち、もともとstlVector[11]
の要素)stlVector[10]
を調べるときににすべての後に要素を引き起こし、それ以前の要素を削除するために前方の一つの位置をシャント、あなたはまだループの最後でi
をインクリメント。だから、次の反復は、実際にstlVector[11]
にもともといた要素であるstlVector[12]
を見ていきます。これを解決するには、--i
を呼び出した後erase()
する必要があります。
を常に確認してください再評価!
また、ビットを明確にします
"の条件を続ける" C、C ++、C#とJavaのすべてのバージョンでループごとに再評価されます。
任意のコンパイラがいることを行うコードを生成しない場合は、、それが壊れている、とのの避けなければならない。
、はい条件は、ループを通るたびに再評価されます。一般的なパフォーマンスの最適化がある理由です。
int saveSize = someExpensiveComputation();
for (int i = 0 ; i < saveSize ; i++)
{
foo(i);
}
の条件ループが全く高価で計算すること、ここで代わりの
for (int i = 0 ; i < someExpensiveComputation(); i++)
{
foo(i);
}
ここで高価な計算は不ループを通して各反復を実行されます。
はい、それはサイズが小さくなります。詳しい情報はここを