すべてstd::vector
のオブジェクトを保持し、すべてのフレームでそれらに渡されるため、すべてのオブジェクトが他のオブジェクトにアクセスできます。私の質問は、オブジェクトがベクトルから自分自身を削除するにはどうすればよいですか?
これは機能しません:
vector.erase(this);
これに対する他の解決策はありますか?
erase
イテレータが必要です。this
メンバー関数/クラス定義内で使用できるポインターです。また、erase
のインスタンスで呼び出す必要がありますvector
-- は使用できませんvector.erase
。
オブジェクトはそれ自体を削除できません。イテレータを渡す必要があります。を使用std::find
して、オブジェクトがベクター内に存在するかどうかを確認し、それを渡すことができます。
要素のイテレータにアクセスして要素を削除する必要がありますstd::find
。
vector.begin() + indexOfElement
あなたがそれを削除できるように:
vector<Type>::iterator it = yourVector.begin() + index;
yourVector.erase(it);
ベクトルはそのデータを配列形式で保存するため、削除する要素の後のすべての要素が左にシフトされることに注意してください (これは高価です)。std::list
ランダム アクセスが必要ない場合は、代わりにa を使用することを検討してください。
前述のように、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);
次のように実行できます。
vec.erase(vec.begin() + (this - &vec.front()));
要素が実際にベクターからのものであると確信している場合
または、セットを使用して set.erase(this) を使用することもできます