Scusate se è stato chiesto prima, ma mi chiedo quale sia l'uso di std::vector::front()
.Per cosa sono usati std :: vector :: front()?
C'è un motivo per utilizzare, ad es. myvector.front()
anziché myvector[0]
o myvector.at(0)
?
Scusate se è stato chiesto prima, ma mi chiedo quale sia l'uso di std::vector::front()
.Per cosa sono usati std :: vector :: front()?
C'è un motivo per utilizzare, ad es. myvector.front()
anziché myvector[0]
o myvector.at(0)
?
Alcuni degli algoritmi generici che funzionano anche sugli elenchi lo utilizzano.
Questo è un esempio di un principio generale: se si fornisce di accesso per tutti i semantiche si supporto, non solo la realizzazione un supporto, è più facile scrivere genericamente e quindi più facile da riutilizzare il codice.
+1: modifica continua. –
Ah, quindi è più coerente con le altre classi di contenitori. Solo per curiosità: è vettore :: front() equivalente a [0] o a a (0)? Voglio dire, cosa succede se il vettore è vuoto? – Tim
@Tim: buona domanda. Wikipedia dice un comportamento indefinito: http://en.wikipedia.org/wiki/Vector_(C%2B%2B) e http://fredosaurus.com/notes-cpp/stl-containers/sequence-functions.html dice lo stesso come [0] che suppongo sia anche indefinito se il vettore è vuoto. – dmckee
Se il tipo di myvector passa a un altro tipo di dati che non è indicizzabile, come un elenco, non sarà necessario modificare il codice che accede alla parte anteriore del contenitore.
Le tue e precedenti risposte del poster devono essere combinate. Concetto astratto + esempio concreto per la vittoria. – Omnifarious
Questa operazione fornisce qualcosa chiamato polimorfismo statico.
Diciamo che ho scritto un algoritmo utilizzando una classe di coda. Ha una funzione front() per ottenere l'elemento successivo della coda e una funzione di accodamento() da aggiungere alla fine della coda. Ora diciamo che ho scoperto che questa classe di coda è scritta male e molto lentamente, e preferisco usare std :: vector che è molto più veloce (so che c'è una std :: queue, questo è solo un esempio). Se l'unico modo per ottenere il primo elemento di un vettore std :: era con v [0], dovrei passare attraverso il mio codice e sostituire tutte le mie chiamate in front() con [0]. Ma implementando front(), std :: vector può ora essere una sostituzione drop-in per la mia classe di coda. L'unico codice che devo cambiare è il tipo del contenitore nel mio algoritmo.
più interessante ... perché c'è un fronte() quando c'è già un inizio()? – Inverse
@Inverse: poiché gli adattatori del contenitore 'std :: queue' e' std :: stack' hanno 'front()' ma non 'begin()'. –
E per essere coerente con 'back()', 'myvector [myvector.size() - 1]' non è così semplice. – dalle