リクエストごとにこれを書いてください。
PS:これは
ベクターから削除する要素のフォローアップの質問です
これは質問のあなたのラインで厄介なパターンです。
真剣に、あなたが反復処理中にコンテナを変更すると、悪いジュジュです。正しいことは難しい。それはしばしばパフォーマンスの面であなたを救うものではありません。 (あなたのニーズにきちんと合った標準的なライブラリアルゴリズムがある限られた場合を除いて)簡単に表現することはほとんどありません。それが間違っていると、パフォーマンスが非常に高くなる可能性があります。あなたが間違っていると、プログラムの正確さの面で非常にコストがかかる可能性があります。これは他の何よりも重要です。
スレッディングが関与している場合は、指数関数的に悪化します。 Javaには、専用の例外タイプがあります。これは、これを試みるときに間違っている可能性のある特定の事柄に対して特に役立ちます。 C++では、あなたはとても幸運ではありません。類似の問題が検出されない可能性があります。
最終結果を生成するコードを書き、元のコンテナを置き換えます。これを本当に減速させることができるのは、「インスタンスはコピーするのに費用がかかります」ということだけです。その場合、問題を処理するためにインダイレクションのレイヤーを使用している必要があります。
list<Elem> original;
// fill elems with some Elems;
list<Elem> modified;
for (
list<Elem>::iterator it = original.begin(), end = original.end();
it != end; ++it
) {
if (something()) {
modified.push_back(*it);
} else if (something_else()) {
modified.push_back(Elem()); // for example
}
// else, 'erase' the element by just not putting anything into 'modified'
// Or we could do whatever other combination of things,
// maybe insert more than one
}
std::swap(original, modified);
これを行わないでください。新しいコンテナを作成し、元のコンテナと置き換えます。 –
@KarlKnechtel、あなたがそれについて詳しく説明してくれれば、それは良い答えになると思います。これは、既存の回答がまだカバーしていないアプローチです。 –