Suppongo che tu sia autorizzato (previsto) a utilizzare l'STL (o qualunque cosa venga chiamata in questi giorni - la "libreria standard", probabilmente).
Per "memorizzare elementi di tipi distinti", usa alcuni contenitori di template.
Per supportare "l'elemento appartiene a una categoria", le coppie articolo + categoria (che è più o meno come un database lo farebbe) o set di elementi per ogni categoria (eventualmente una singola mappa con categoria come chiave e set di elementi come valori).
Dice "distinti" tipi, quindi forse non puoi supporre che i tipi siano correlati.
"In memoria" significa che non ha bisogno di essere serializzato o salvato su disco ... e presumibilmente non deve utilizzare un'implementazione di database esistente che non fa parte della libreria standard C ++.
Non mi è chiaro quale sia l'"identità" di un oggetto. Per esempio. ogni tipo ha un ID? O passi l'indirizzo di (cioè un puntatore a) un oggetto come parametro per il metodo remove?