2014-09-16 6 views
5

Sto utilizzando il metodo find() di std::map, che restituisce un iteratore.
Tuttavia ho bisogno dell'indice dell'elemento trovato; ad esempio: 0, che corrisponde a std::map::begin() e così via.Stampa dell'indice di un iteratore in std :: map

#include <map> 
#include <utility> 
#include <iostream> 

int main() 
{ 
    std::map< int, int > aMap; 
    aMap.insert(std::make_pair(100, 50)); 
    aMap.insert(std::make_pair(200, 40)); 
    aMap.insert(std::make_pair(300, 60)); 

    std::map< int, int >::iterator it_map = aMap.find(300); 
    if (it_map != aMap.end()) 
    std::cout << it_map << "\n"; // error 

} 

Che non viene compilato e conosco il motivo. Tuttavia, ho bisogno di un modo per stampare 2 perché l'indice di 300 è 2.

Per questo semplice esempio, si può dire che la mappa (albero binario) non è un buon contenitore. Tuttavia, nel codice reale, ci sono un sacco di elementi che devo cercare e l'albero binario fa bene.

Qualche idea?

+2

Come si definisce l'indice di una struttura ad albero binario ? – 101010

+0

@ 40two: una mappa non è necessariamente implementata come albero e non ha un'interfaccia ad albero; ma è ordinato, quindi puoi definire un indice secondo quell'ordine come la domanda descrive. –

+0

@MikeSeymour Come da standard non è necessariamente implementato come albero, concordato. Tuttavia, in ogni implementazione che conosco è implementato come un albero. Inoltre, quando si verifica un inserimento o un'estrazione, qualsiasi ordine precedente viene disturbato. Di conseguenza, come la tua risposta afferma correttamente, puoi definire un indice ma solo per lo stato della corrente 'std :: map'. – 101010

risposta

7

Se è necessario l'indice, forse una mappa è il tipo di dati errato; è necessario scorrere la mappa (in tempo lineare) per trovare l'indice, perdendo il beneficio della ricerca tempo-logaritmico.

Forse un vettore ordinato, utilizzando l'algoritmo lower_bound per trovare elementi in tempo logaritmico, potrebbe essere più adatto. Quindi è possibile sottrarre l'iteratore di accesso casuale risultante dall'iteratore begin() in tempo costante.

Tuttavia, se si vuole utilizzare una mappa:

std::cout << std::distance(aMap.begin(), it_map) << '\n'; 
5

Usa std::distance, in questo modo:

std::cout << std::distance(std::begin(aMap),it_map) << endl; 

Documentazione here