1

重複の可能性:
ベクターからの要素の消去

途中でいくつかの要素を削除したいので、反復を見逃したくない

私は今次のようにトラバースします

vector<double> distances;
for(size_t i=0; i<distances.size();i++)
{

}

要素を安全に削除しながら必要な要素にアクセスできるように、端から端までトラバースするにはどうすればよいですか?

4

3 に答える 3

2

これを処理する最善の方法は、実際にはごまかすことです。

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 メソッドを使用して、コンテナーにこれらすべての要素を一度に削除するように指示します。

于 2012-10-18T09:14:21.577 に答える
2
for (size_t i = distances.size() - 1; i >=0; --i)

ただし、std::remove_if代わりに

于 2012-10-18T08:52:25.150 に答える
1

使用reverse_iterator :

vector<something>::reverse_iterator iter = v.rbegin();
iter++; //Iterates backwards
于 2012-10-18T08:50:13.883 に答える