1

すべてstd::vectorのオブジェクトを保持し、すべてのフレームでそれらに渡されるため、すべてのオブジェクトが他のオブジェクトにアクセスできます。私の質問は、オブジェクトがベクトルから自分自身を削除するにはどうすればよいですか?

これは機能しません:

vector.erase(this);

これに対する他の解決策はありますか?

4

5 に答える 5

8

eraseイテレータが必要です。thisメンバー関数/クラス定義内で使用できるポインターです。また、eraseのインスタンスで呼び出す必要がありますvector-- は使用できませんvector.erase

オブジェクトはそれ自体を削除できません。イテレータを渡す必要があります。を使用std::findして、オブジェクトがベクター内に存在するかどうかを確認し、それを渡すことができます。

于 2012-06-16T17:58:30.473 に答える
4

要素のイテレータにアクセスして要素を削除する必要がありますstd::find

vector.begin() + indexOfElement

あなたがそれを削除できるように:

vector<Type>::iterator it = yourVector.begin() + index;
yourVector.erase(it);

ベクトルはそのデータを配列形式で保存するため、削除する要素の後のすべての要素が左にシフトされることに注意してください (これは高価です)std::listランダム アクセスが必要ない場合は、代わりにa を使用することを検討してください。

于 2012-06-16T17:59:06.693 に答える
1

前述のように、std::find ( http://www.cplusplus.com/reference/algorithm/find/ ) を使用できます。これには、私が間違っていなければ == 演算子をオーバーロードする必要があります。

例えば

std::vector<YourObjectType>::iterator it = find(yourVector.begin(), yourVector.end(), referenceToObject);

bool operator == (const YourObjectType* object) {return object == this; }

そして、あなたはただ使うyourVector.erase(it);

于 2012-06-16T18:33:58.407 に答える
1

次のように実行できます。

vec.erase(vec.begin() + (this - &vec.front()));

要素が実際にベクターからのものであると確信している場合

于 2012-06-16T18:38:28.483 に答える
1

または、セットを使用して set.erase(this) を使用することもできます

于 2012-06-16T18:10:38.400 に答える