2011-05-11 14 views
45

Sto scrivendo un piccolo pezzo di codice in cui dovrò inserire valori in un vettore STL C++ in un determinato punto a seconda dei valori negli elementi vettoriali . Sto usando la funzione insert() per fare ciò. Mi rendo conto che quando voglio aggiungere un nuovo elemento alla fine del vettore, posso semplicemente usare push_back(). Ma per mantenere il mio codice bello, vorrei usare esclusivamente insert(), che prende come input l'iteratore che punta all'elemento dopo il punto di inserimento desiderato e il valore da inserire. Se il valore dell'iteratore passato come argomento è v.end(), dove v è il mio vettore, funzionerà allo stesso modo di push_back()?Uso di vettore C++ :: insert() per aggiungere alla fine del vettore

Grazie mille!

+3

Se si utilizza inserendo molto in un vettore, è possibile che si stia utilizzando la struttura dati errata. Considerare (ad esempio) l'utilizzo di un deque. Naturalmente se il vettore è piccolo, non ci saranno problemi. –

+13

@Nick: Sì, lo farà. Un semplice esperimento avrebbe potuto dirti questo. –

+12

@Space Non vedo come avrebbe potuto dirlo a un esperimento. Se fosse invalido, otterrebbe UB, nel qual caso il suo programma avrebbe potuto sembrare funzionare. –

risposta

77

a.push_back(x) è definito per avere semantica identica a (void)a.insert(a.end(),x) per contenitori sequenza che lo supportano.

Vedere la tabella 68 in ISO/IEC 14882: 2003 23.1.1/12 [lib.sequence.reqmts].

+1

Domanda veloce, in termini di prestazioni, mi chiedo se pusk_back funziona più velocemente? Ho provato qualcosa mostrando inserto è un po 'lento. Volevo solo assicurarmi ... Grazie – Saman

+1

push_back() non restituisce l'iteratore dell'elemento appena inserito. std :: list :: end() restituirà un iteratore morto. – peterh

14

C'è una leggera differenza che push_back restituisce void se insert restituisce iterator all'elemento appena inserito.

A proposito, c'è un altro modo per verificare se fanno la stessa cosa: compilare i seguenti codici

int main() 
{ 
    std::vector<int const> v; 
    v.push_back(0); 
    return 0; 
} 

il compilatore di stampare un sacco di messaggi fastidiosi, basta leggere e troverete push_back chiamate insert (in caso contrario, prova a compilare v.insert(v.end(), 0) per vedere se chiamano la stessa funzione di inserimento) alla fine.