2012-12-14 3 views
9

Come posso ottenere la posizione in cui è stato effettivamente inserito il mio oggetto?Ottieni l'indice dell'oggetto inserito in un vettore

#include <vector> 
using namespace std; 

vector<SomeClass> list; 
SomeClass object; 
list.push_back(object); 

list[...].method(); // I do not have the key 

Purtroppo push_back non restituisce nulla dal suo tipo di ritorno è void.

+5

Come suggerimento non correlato, non utilizzare mai 'elenco' come nome per una variabile, in particolare non per una variabile di tipo 'vettore'. 'elenco' è anche un contenitore nella libreria standard. Avere una lista di nomi vettoriali sarà una continua fonte di dolore per chiunque debba leggere questo codice. –

+1

Ho cambiato il nome della tua classe da 'class' (che è C++ non valido) in' SomeClass' e aggiunto [un pensiero sull'idea] (http://stackoverflow.com/a/40740375/2932052) dietro l'apparentemente " comportamento banale ". – Wolf

risposta

14

Se v è il vostro vettore, di seguito vi darà la posizione (cioè, l'indice):

v.push_back(object); 
size_t pos = v.size() - 1; 

Oppure si può guardare la size() prima di chiamare push_back(). Quindi non è necessario sottrarre uno.

+0

Grazie sia per la risposta che per il suggerimento di esaminare la dimensione prima di inserirla. – danijar

6

È possibile utilizzare il membro back() per ottenere un riferimento all'ultimo elemento:

list.push_back(object); 
list.back(); 

Oppure, dato push_back() aggiunge semplicemente l'oggetto alla fine, l'indice dell'elemento appena inserita è il dimensione del vettore meno uno:

list.push_back(object); 
vector<my_class>::size_type object_pos = list.size() - 1; 
+1

Suppongo che dia un iteratore che punta all'ultimo elemento inserito? In quel momento sono più interessato all'indice come un numero intero che nell'oggetto stesso. – danijar

+0

@sharethis No, back() restituisce un riferimento. Per ottenere l'indice dell'elemento inserito, calcola la nuova dimensione vettoriale e sottrai una. –

+0

Analogamente, '& v.back() - & v.front()' in seguito. – MSalters

1

Se è necessario individuare un particolare elemento dopo averli, e non si vuole salvare l'indice prima del tempo (nel caso in cui si fa qualcosa al vettore come sorta/aggiungi/rimuovi/etc), potresti anche usare lo find algorithm.

+0

Bene, sai quanti elementi hai inserito in modo che tu possa trovare l'indice molto più semplice (e molto più efficiente) che usando 'find'. –

+1

Sto dicendo che se hai bisogno di trovare qualche chiave dopo che gli elementi sono stati inseriti, e non hai già salvato l'indice che vuoi, potrebbe funzionare. Solo un altro strumento da considerare in base al problema. – WildCrustacean

0

Mentre NPE's correct answer mostra un POV pragmatico, mi concentro sul ragionamento per questa semplice risposta. Il comportamento osservabile è just the purpose of the push_back member function:

Aggiunge il valore dell'elemento specificato alla fine del contenitore.

Così l'indice è sempre uguale a v.size() prima dell'inserimento o, equivalentemente, v.size()-1 dopo l'inserimento. Se questa asserzione non può essere soddisfatta, la capacità del contenitore non può essere aumentata o la tua classe genera un'eccezione nel costruttore copia/sposta (vedere la sezione Exceptions nella documentazione).