2010-06-01 12 views
6

Devo eseguire il cout e restituire l'indice di un elemento deque a cui punta un iteratore. Come ottengo un int di un iteratore?In C++, come ottengo un indice int di un iteratore?

+0

Perché hai bisogno dell'indice? Non puoi semplicemente dereferenziare l'oggetto e fare iterator aritmetico su di esso? –

+0

Come mai? Non direzionare l'iteratore equivale a dereferenziare un puntatore e darmi l'indirizzo di memoria, non la posizione nella deque? – user83

risposta

3
std::ptrdiff_t index = std::distance(myDeque.begin(), curIterator); 
9

È possibile utilizzare:

std::ptrdiff_t index(std::distance(my_container.begin(), my_iterator)); 

essere consapevoli dei costi di esecuzione di tale procedura, tuttavia- dipende dalla struttura dei dati che si usa.

+1

O piuttosto dipende dalla classe di iteratore (casuale, avanti, ecc.) –

+0

Sto assumendo passi di distanza attraverso ogni elemento del contenitore per trovare il numero, quindi per un deque grande il costo di runtime sarebbe grande. Tuttavia, il mio deque non dovrebbe essere più grande di 10 elementi. E la distanza restituisce un int? Che cosa fa la chiamata a index()? – user83

+0

Se la tua deque non dovesse contenere più di 10 elementi, ti suggerirei di utilizzare invece 'vector', o almeno di avere una buona motivazione per attaccare con deque. La "chiamata" index() è solo una variabile chiamata 'index' costruita con il valore restituito da' std :: distance'. – fbrereto

4

Per iteratori ad accesso casuale si può semplicemente utilizzare la sottrazione:

size_t index = some_iterator - some_deque.begin() 

Ovviamente questo non funziona per tutti gli iteratori ma mi piacerebbe sostengono che c'è una certa eleganza in (ad esempio per std::list o qualsiasi altra cosa.) che puoi usare questa tecnica solo quando ci vorrà del tempo costante. Se il tuo contenitore non ha iteratori ad accesso casuale, probabilmente non è sensato cercare di trovare comunque l'indice.

+0

Penso che voterò questa la migliore risposta per la sua semplicità ed eleganza. Potrei assegnare il risultato a un int per farlo trasmettere ad un int? – user83

+0

È possibile assegnarlo a un int, ma probabilmente riceverai un avviso del compilatore a livelli di avviso più elevati (conversione non firmata - firmata o abbreviazione effettiva del tipo, a seconda del compilatore, ecc.).È un po 'fastidioso dover eseguire il cast esplicito su int, ma questo non nasconderà un problema a meno che tu non abbia più di 2 miliardi di elementi nella tua creatività, il che credo che sarai abbastanza sicuro che non lo farai :) – Peter

2

Dei due metodi presentati:

std::ptrdiff_t index(std::distance(my_container.begin(), my_iterator)); 

e

std::ptrdiff_t index = some_iterator - some_deque.begin() 

... il secondo ha la superiorità di essere applicabile solo alle iteratori ad accesso casuale - quindi quando sostituendo un altro contenitore , non accidentalmente ottenere un'operazione costosa (O (n) per gli elenchi, ad esempio).