2013-04-06 16 views
5

Desidero memorizzare i dati per entrambi, il loro nome e il loro indice. In altre parole, voglio mappare i nomi string agli oggetti e dare loro un ordine personalizzato.Mappa con più chiavi in ​​C++

Quello che mi è venuto in mente prima è un std::vector di coppie della chiave string e l'oggetto. L'ordine è stato dato dalla posizione nel vettore.

std::vector<std::pair<std::string, object> > 

Ma questo approccio sembra essere ottimale, poiché non controlla automaticamente per l'unicità di string nomi. Inoltre, è sbagliato raggruppare gli oggetti in base al loro ordine, perché logicamente la loro distinzione di primo ordine è il nome.

Ho bisogno di una struttura dati che consenta l'accesso sia per nome che per indice.

std::magic<std::string, unsigned int, object> collection; 

// access by either string or unsigned int key 
collection.insert("name", 42, new object()); 
collection["name"] 
collection[42] 

Esiste già una struttura dati per questo caso d'uso? Se no, come posso metterne uno, preferibilmente usando la libreria standard? Vorrei anche un modo per inserire nuovi elementi nella posizione dopo un dato elemento senza spostare tutti gli altri elementi attorno.

+1

avete bisogno di due oggetti 'std :: map'. –

+0

@ n.m. Non ho bisogno di ordinare per nome della stringa. Quindi in pratica ho bisogno di un 'std :: vector' per l'ordine e di un' std :: unordered_map' per i nomi. Ma la mia domanda è se esiste già una soluzione o almeno una via preferibile. – danijar

+1

'unordered_map' è una possibilità se stai usando C++ 11. Per gli indici, una scelta tra 'vector' e' map'/'unordered_map' è dettata da cosa dovrebbe accadere quando si rimuovono oggetti dalla propria collezione. Se non ti preoccupi degli indici stabili, puoi usare 'vector'. Penso che due contenitori * siano * il modo preferibile. –

risposta

Problemi correlati