Per identificare il dataset derivato, la cosa prestazionalmente più veloce è l'accoppiata:
funzione_che_restituisce_un_flag_di_tipo + static_cast<>
segue il typeid() e infine il dynamic_cast<> (circa 10 volte più lento rispetto al primo metodo. Si parla di 4ms contro 40 comunque, non di ore).

Il problema del primo metodo, però, è che se hai tanti tipi derivati (non istanze, parlo di classi) , la cosa tende a diventare un po' rognosa da gestire.

Detto questo: se con "rimuovere" intendi togliere fisicamente da una locazione del vector, ricorda che il vector è lento nelle operazioni di rimozione mediane. Meglio una lista per questo.
Se intendi effettuare solo una delete sul puntatore che ti interessa, indentificare il tipo non è necessario.
Puoi chiarire questo punto?