Se ho ben capito, devi solo trovare il puntatore che ti interessa all'interno del vector (aspetta a cambiarlo) e poi togliere quel particolare puntatore.
Questo punto è importante perché la RTTI (o il sistema di flags) permette di identificare il tipo di dato, non il suo indirizzo nel vector. Stiamo parlando di un puntatore all'interno del vector, non di this: sono due cose diverse.
Con la RTTI (o il sistema di flags) puoi estrapolare tutte le istanze di un dato particolare, ma non conoscere il valore memorizzato in una locazione specifica del vector, allocata con new: quello lo devi memorizzare a parte.
A mio avviso il modo più semplice è associare a ogni istanza un indice, e usare quello per rintracciare il puntatore che ti interessa.
In quanto alla rimozione, potresti anche adottare un altro sistema.
Una volta trovato il puntatore che ti interessa, ne fai la delete e metti a nullptr il puntatore.
Quando andrai a inserire un nuovo dataset, controlli se esiste una locazione libera. Se si usi quella e setti l'indice corrispondente, se no aggiungi in coda (grosso modo è uno dei principi di funzionamento di un allocatore di memoria).
Un esempio minimale, giusto per concretizzare la cosa:
codice:class Test { public: virtual int type()=0; virtual ~Test() {} virtual void set_pos(int p) { pos = p; } virtual int get_pos() { return pos; } Test* address() { return this; } int pos; }; class Derived : public Test { public: int type() { return 1; } }; class Derived2 : public Derived { public: int type() { return 2; } }; class Derived3 : public Derived2 { public: int type() { return 3; } }; int main(int argc, char* argv[]) { /* Inserimento elementi e indice */ vector<Test*> v; v.push_back(new Derived); v[0]->set_pos(0); v.push_back(new Derived2); v[1]->set_pos(1); v.push_back(new Derived3); v[2]->set_pos(2); /* L'indirizzo nel vector non è quello dell'istanza */ cout << &v[0] << " --- " << v[0]->address() << endl; cout << &v[1] << " --- " << v[1]->address() << endl; vector<Test*>::iterator it = v.begin(); vector<Test*>::iterator ed = v.end(); /* Ricerca nel vector dell'istanza con indice x e relativo delete */ for (; it != ed; ++it) { if (*it && (*it)->get_pos() == 1) { delete *it; *it = nullptr; // 0 o NULL se non C++11 } } /* Scansione locazioni libere. Se ne trovo una la uso */ int p=0; for (it = v.begin(); it != ed; ++it, p++) { if (*it == nullptr) { *it = new Derived3; (*it)->set_pos(p); } } /* Nessuna locazione libera. */ if (p == v.size()) { v.push_back(new Derived3); (*v.rbegin())->set_pos(p); } /* Elimino tutto */ for (it = v.begin(); it != ed; ++it) { cout << (*it)->get_pos() << endl; delete *it; } }