2

ベクトルにa、b、c、d、eが含まれていますvec [2]はcですが、cを削除/消去した後、自動的に並べ替えられますか?つまり、vec[2]は操作後dです。

4

3 に答える 3

2

論理的にはそうです。ベクトルは要素の動的配列であるためです。1つを削除すると、後続のすべてが移動されます。

同様に、要素を消去すると、ベクトルの全長が短くなります。

cplusplus.comから

これにより、削除された要素の数だけベクトルサイズが効果的に縮小され、前に各要素のデストラクタが呼び出されます。

ベクトルは配列形式を保持するため、ベクトルの終わり以外の位置で消去すると、セグメントが消去された後のすべての要素も新しい位置に移動します。これは、他の種類のシーケンスコンテナ(deque、list)での消去ほど効率的な方法ではない場合があります。 。

于 2012-08-08T09:53:34.270 に答える
1

規格によると:

イテレータerase(const_iterator position);

...。

効果:消去の時点以降でイテレータと参照を無効にします

複雑さ:Tのデストラクタは、消去された要素の数に等しい回数と呼ばれますが、Tのムーブ代入演算子は、消去された要素の後のベクトル内の要素の数に等しい回数と呼ばれます。

ご覧のとおり、ムーブ代入演算子は、消去された要素の後に要素がある回数だけ呼び出され、後の要素へのすべての参照/イテレータは無効になります。

したがって、1つの要素が消去されると、後続のすべての要素が移動されて、消去された要素があった「空白」のスペースが埋められます。

無効化された参照/イテレータに関するポイントは、特に覚えておくことが非常に重要です。ループで消去する場合。最新の標準によると、消去は、使用できる次の要素へのイテレータ、または消去と削除のイディオムを返す必要があります

于 2012-08-08T10:13:07.957 に答える
0

反復中にこれの副作用が心配な場合は、消去-削除イディオムを使用してください

于 2012-08-08T09:58:10.567 に答える