Qualcuno potrebbe spiegarmi qual è il significato di past-the-end
. Perché chiamiamo la funzione end()
"past-end"?Che cos'è l'iteratore passato-fine in STL C++?
risposta
Le funzioni begin()
e end()
definiscono un metà intervallo aperto ([begin, end)
), il che significa:
La gamma include primo elemento ma esclude l'ultimo elemento. Quindi, il nome oltre la fine.
Il vantaggio di un intervallo aperto metà è:
Evita una gestione speciale per intervalli vuoti. Per intervalli vuoti,
begin()
equivale aend()
.rende il criterio finale semplice per cicli che un'iterazione sugli elementi: Le anse semplicemente continuano fintanto
end()
non viene raggiunto
Letteralmente, perché punta un punto oltre la fine della matrice.
Viene utilizzato perché quell'elemento è vuoto e può essere iterato ma non dereferenziato.
int arry[] = {1, 2, 3, 4, /* end */ };
^^^^^^^
std::end(arry) would point here.
Non solo array; l'iteratore 'fine' punta oltre la fine della sequenza di destinazione, indipendentemente da dove provengono gli iteratori o dove sono contenuti i valori. –
Perché non punta alla ultima elemento di un contenitore, ma da qualche parte passato l'ultimo elemento di un contenitore.
Se si denota end()
, il risultato è comportamento non definito.
Come intervallo in matematica, stl utilizza [begin, end)
.
Ecco perché possiamo scrivere for (auto it = v.begin(); it != v.end(); ++it)
Sì! La prima risposta che non parla di contenitori, che non sono necessari per creare sequenze. –
Aggiunta altro punto per le risposte corrette sopra. Anche questo è stato fatto per essere compatibile con gli array. Ad esempio, nel codice qui sotto:
char arr[5];
strcpy(arr, "eakgl");
sort(&arr[0], &arr[5]);
Questo funziona bene.
Invece se si avevano dato:
sort(&arr[0], &arr[4]);
sarebbe perdere l'ordinamento l'ultimo carattere.
Questo aiuta anche a rappresentare i contenitori vuoti in modo naturale.
- 1. Espressioni regolari in C++ STL
- 2. Padding stl stringhe in C++
- 3. C equivalente di C++ STL
- 4. C++ stl convolution
- 5. C++ UNICODE e STL
- 6. RAII e C++ STL
- 7. C errore ++ STL rimuovere
- 8. Problem solving in C++ con STL
- 9. Corrispondenti numeri casuali deterministici in C++ STL
- 10. Esiste una classe STL C++ che funziona come una pipe?
- 11. Un programma STL C++ che utilizza il predicato come predicato
- 12. STL C++, iteratori costanti, find()
- 13. Allocatori conformi a STL C++
- 14. C++ STL pop_heap non funziona
- 15. C++ stl stringstream accesso diretto al buffer
- 16. Vettori STL C++: ottieni iteratore dall'indice?
- 17. STL map to generic vector C++
- 18. Più facile istanza di iterazione C++ STL
- 19. Pre-allocare spazio per coda C++ STL
- 20. Iterating over STL vector bidimensionale C++
- 21. C++ STL vettoriale: push_back prendendo riferimento
- 22. C++ STL Permutazione Prossimo con Combinazione
- 23. Stesse permutazioni in due array utilizzando next_permutation() stl in C++
- 24. Utilizzo di STL con Android NDK C++
- 25. Come collegare STL nel codice C++?
- 26. C++ stl ciò fa base() fare
- 27. Vettore STL C++ per dati esistenti
- 28. C++ mappa STL :: cancellare un inesistente chiave
- 29. stl priority_queue di C++ con struct
- 30. È tutto implementabile dall'utente in C++ 11 STL?
+1 Ottima risposta. – Nawaz
L'illustrazione odora Josuttis :) – fredoverflow
Non solo 'begin()' e 'end()'; generalmente, '[begin, end)' definisce una ** sequenza ** di valori, indipendentemente da dove provengono gli iteratori o dove sono contenuti i valori. –