1

ベクトル V があり、このベクトルのどの要素を後で削除する必要があるかを保存したいと考えています。

そのために、別のベクトル Y を使用して、削除したい V の要素の反復子を格納しました。そこで、Y を反復処理して、V で削除する必要がある要素の反復子にアクセスします。

問題は、V から要素を消去すると、Y のすべての反復子 (V の要素を指している) が無効になることです。

答えが見つかりませんが、簡単な回避策が必要なほど些細なことだと思いませんか?

4

4 に答える 4

5

使用するV.erase(std::remove_if(V.begin(), V.end(), MyPredicate()), V.end())

于 2013-07-03T12:16:02.803 に答える
3

std::vector<unsigned> indices各要素のインデックス値を格納するために使用できます。

于 2013-07-03T12:16:40.843 に答える
0

これは複雑さについてです。

要素を高いインデックスから低いインデックスに消去できます。その場合、アプローチは機能しますが、ベクトルの要素を消去するたびに、それに続く要素が再配置されます。これには、消去された要素に続く要素の数に線形の複雑さがあるため、一種の二次複雑さ、またはO(number_of_elements * number_of_elements_to_be_erased).

削除の数が多く、削除する要素のインデックスが範囲全体に多かれ少なかれ均一に分布している場合、複雑さの観点からは、「削除する要素」の補完に取り組むことがより良い解決策になります。代わりに、「保持する要素」になり、保持する必要がある要素を新しい配列にコピーして、古い配列に割り当てます。これは、ベクトルの要素数に比例しO(number_of_elements)ます。

さらに良いことに、実装を完全に制御でき、std::list の std::vector を変更できる場合は、説明したとおりに残りを続行でき、悪影響はありません。その場合、消去も効率的で、一定時間で行われるため、操作全体はO(number_of_elements_to_be_erased).

于 2013-07-03T12:34:25.317 に答える