重複の可能性:
ベクターからの要素の消去
途中でいくつかの要素を削除したいので、反復を見逃したくない
私は今次のようにトラバースします
vector<double> distances;
for(size_t i=0; i<distances.size();i++)
{
}
要素を安全に削除しながら必要な要素にアクセスできるように、端から端までトラバースするにはどうすればよいですか?
重複の可能性:
ベクターからの要素の消去
途中でいくつかの要素を削除したいので、反復を見逃したくない
私は今次のようにトラバースします
vector<double> distances;
for(size_t i=0; i<distances.size();i++)
{
}
要素を安全に削除しながら必要な要素にアクセスできるように、端から端までトラバースするにはどうすればよいですか?
これを処理する最善の方法は、実際にはごまかすことです。
C++ では、消去/削除イディオムが最も効率的です。述語を作成してから始めます。ラムダを使用すると、非常に簡単になりました。
// This removes all odd elements in vec
vec.erase(vec.remove_if([](int i) { return i % 2 == 1 }), vec.end();
そのremove_if
仕組みは、要素をシャッフル (コピーまたは移動) して、保持したいすべての要素をコンテナーの先頭に集め、末尾を未指定の (ただし有効な) 状態のままにしてから、に戻ることです。テールの最初の要素へのイテレータ。
次に、コンテナーの range-erase メソッドを使用して、コンテナーにこれらすべての要素を一度に削除するように指示します。
for (size_t i = distances.size() - 1; i >=0; --i)
ただし、std::remove_if
代わりに
使用reverse_iterator :
vector<something>::reverse_iterator iter = v.rbegin();
iter++; //Iterates backwards