2013-07-25 11 views
18

Ho un std::map chiamato myMap nella mia applicazione C++, e voglio ottenere un elemento usando myMap.find(key) o myMap[key]. Tuttavia, vorrei anche ottenere l'indice di quell'elemento nella mappa.Ottenere l'indice dell'elemento nella mappa C++

std::map<string, int> myMap; 
// Populate myMap with a bunch of items... 
myElement = myMap["myKey"]; 
// Now I need to get the index of myElement in myMap 

C'è un modo pulito per farlo?

Grazie.

+3

le mappe non hanno un indice, ma un iteratore. – user1810087

+13

Non penso che vogliate realmente intendervi, ma quello che state * chiedendo * è 'std :: distance (std :: begin (myMap), myMap.find (" myKey "))'. – BoBTFish

+0

Sono curioso: perché vuoi farlo? – Raptor

risposta

8

A std::map in realtà non ha un indice, invece ha un iteratore per una coppia chiave/valore. Questo è simile a un indice in quanto rappresenta una posizione di ordinamento nella raccolta ma non è numerico. Per ottenere l'iteratore di una coppia chiave/valore utilizzare il metodo

std::map<string, int>::iterator it = myMap.find("myKey"); 
0

Non esiste un indice in una mappa. Le mappe non sono memorizzate (almeno non necessariamente, e in effetti non sono nella maggior parte delle implementazioni) come una sequenza di "coppie".

Indipendentemente dall'implementazione, tuttavia, std :: map non modella un contenitore con un indice.

A seconda di cosa si sta facendo questa domanda, l'"indice" può essere un iteratore (come suggerito da altri) o la chiave stessa.

Tuttavia, sembra strano che tu abbia fatto questa domanda. Se potessi darci qualche dettaglio in più, saremmo probabilmente in grado di indicarti una soluzione migliore al tuo problema.

+0

Penso che tu abbia modificato la tua seconda frase a molto, è il contrario di vero –

0

La semantica di una mappa non include gli indici find. Per capire questo, puoi notare che le mappe sono in genere implementate come alberi. Pertanto, gli elementi in esso non hanno un indice (prova a definire un indice in modo naturale per un albero).

1

Bene: la mappa mantiene la chiave ei dati come coppia in modo da poter estrarre la chiave spostando l'iteratore della mappa in coppia o direttamente nel primo elemento della coppia.

std::map<string, int> myMap; 
std::map<string, int>::iterator it; 

for(it=myMap.begin();it!=myMap.end();it++) 
{ 
    std::cout<<it->first<<std::endl; 
} 
42

Sono venuto qui in cerca di questa risposta, ma ho trovato questa funzione distanza prende 2 iteratori e restituisce un indice

cout << distance(mymap.begin(),mymap.find("198765432")); 

speranza che questo aiuta: D

+9

Questa è davvero la risposta alla domanda – Boinst

+0

Non ha ' O (N) 'complessità? – willir

0

Map è un valore-chiave struttura dati che internamente dati in una struttura ad albero. Ci sono soluzioni O (n) sopra indicate. "distance (mymap.begin(), mymap.find (" 198765432 "))" non ti fornirà la risposta corretta. Per la vostra esigenza, dovete costruire la vostra struttura di dati del tipo di albero del segmento per le operazioni competitive di O log (n).

1

Se la mappa è già stata riparata (non aggiungere/eliminare alcuna chiave in seguito) e si desidera ottenere un indice da esso. È possibile effettuare le seguenti operazioni:

Creare una matrice che memorizzi le chiavi dell'intera mappa. E lì ce l'hai, le chiavi sono accessibili per indice!

vector<int> keys; 
for (pair<K,V> entry : yourMap) { 
    keys.push_back(entry.first); 
} 

E questo è tutto.Per accedere a un indicedella mappa, utilizzare yourMap[keys[i]]

Il vantaggio di questo metodo rispetto alla funzione distance è la complessità del tempo. È garantito O(1).