Quanto è rigoroso il controllo dei limiti sui vettori rispetto agli array di heap? Quanto esattamente sta controllando i limiti e come si confronta con il modo in cui viene verificato un array di heap?I vettori sono più rigorosi nel controllo dei limiti rispetto agli array di heap?
risposta
Un vector
farà il controllo dei limiti, se si utilizza la funzione at()
, ad esempio:
std::vector<int> v(5);
v.at(3) = 10;
v.at(5) = 20; // throws an exception, std::out_of_range
Tuttavia, se si utilizza operator[]
, non ci sono limiti di controllo. (E l'accesso a elementi inesistenti porta ad un comportamento indefinito.)
Va notato, però, che la maggior parte delle implementazioni avranno la possibilità di includere limiti controllo su tutti gli iteratori, di cui si parla nelle risposte here. Per impostazione predefinita, VS2008 e versioni successive sono attivate in Debug e Release, VS2010 solo in Debug. gcc richiede di definire _GLIBCXX_DEBUG
per ottenere gli iteratori verificati.
so .at() lo chiama esplicitamente per fare un controllo e [] lo lascia in esecuzione nel compilatore? Per qualche ragione stavo usando [] e sembrava ancora più irregolare rispetto agli array regolari. Bene, grazie per la risposta. – Faken
@Fraken: Sì, 'operator []' deve solo restituire un elemento esistente. Se non può, ciò che accade lascia il tuo programma in uno stato indefinito. (Potrebbe andare in crash, restituire spazzatura, lasciare che un debugger di implementazione entri in azione, attivare un assert, ecc.) L'unico modo per garantire di ottenere i controlli è con 'at()'. – GManNickG
Credo che l'operatore [] affermerà che il valore è compreso nell'intervallo, quindi è possibile visualizzare più comportamenti durante la compilazione in modalità di debug. L'operatore – Cogwheel
Definita in fase di implementazione, vector contract non fornisce garanzie di verifica dei vincoli. Ma, una cosa è certa, sarà non peggiore di un array di heap.
Nella mia implementazione SGI:
vector::operator[]
non sia selezionatavector::at()
è legato controllato
Dalla definizione file di intestazione di operator[]
:
/**
* @brief Subscript access to the data contained in the %vector.
* @param n The index of the element for which data should be
* accessed.
* @return Read-only (constant) reference to data.
*
* This operator allows for easy, array-style, data access.
* Note that data access with this operator is unchecked and
* out_of_range lookups are not defined. (For checked lookups
* see at().)
*/
E per vector::at()
:
In un'implementazione tipica, gli array non vengono controllati affatto, indipendentemente dall'assegnazione. std::vector
richiede il controllo dei limiti su at()
. L'accesso fuori limite con operator[]
fornisce un comportamento indefinito, quindi è possibile eseguire anche il controllo dei limiti, ma è piuttosto insolito.
Ancora più importante, tuttavia, consiglierei in genere l'utilizzo di algoritmi che eliminano principalmente la preoccupazione in primo luogo. Quando fai qualcosa come: for (i=0; i<N; i++)
, è abbastanza facile per N essere la cosa sbagliata. Quando usi algorithm(x.begin(), x.end(), ...);
è molto più facile ottenere un ragionevole grado di certezza che la tua logica sia corretta.
- 1. limiti Disabilitare il controllo per C++ vettori
- 2. Limiti di array Controllare l'eliminazione nel CLR?
- 3. opzioni di controllo R CMD per "test più rigorosi" - 2.15.0
- 4. Quali sono i limiti NSubstitute, specialmente rispetto a MOQ?
- 5. Confronto delle prestazioni dell'array di array rispetto agli array multidimensionali
- 6. Quali sono i limiti pratici dei thread per CPU?
- 7. Quali sono alcuni dei più "puri" linguaggi orientati agli oggetti?
- 8. Vettori di riferimenti agli oggetti
- 9. Perché i vettori sono così poco profondi?
- 10. Controlli dei limiti statici sugli array Haskell
- 11. Come identificare i posti in MATLAB in cui i dati sono memorizzati al di fuori dei limiti di un array?
- 12. I selettori CSS dell'attributo dei dati sono più veloci dei selettori di classe?
- 13. Quanto sono pesanti i thread Java rispetto agli attori Scala/Akka?
- 14. Limiti di dimensione array
- 15. Le operazioni basate sull'elemento sono più veloci con le funzioni NumPy rispetto agli operatori?
- 16. array di vettori o vettore di array?
- 17. Converti Elenco dei vettori nel fotogramma dati dei Conti
- 18. I componenti sono veramente più veloci rispetto ai modelli?
- 19. I vettori in C++ sono così lenti?
- 20. Heap alloca un array 2D (non un array di puntatori)
- 21. C++ vettori non come array
- 22. Ordinamento heap 1-array?
- 23. Mostrare il controllo all'interno del controllo utente al di fuori dei limiti della sua madre
- 24. Quali sono i limiti utili degli automi legati lineari rispetto alle macchine di Turing?
- 25. Quali sono i limiti di un thread STA rispetto ai thread MTA?
- 26. concatenare i vettori di un array di celle in MATLAB
- 27. Quali sono i limiti tecnici di phoneGap/Cordova?
- 28. Modifica dei vettori di movimento nel decodificatore ffmpeg H.264
- 29. Rendi rigorosi i modelli di django
- 30. Elenco dei limiti/restrizioni Silverlight
Stai usando '[]' o 'at()'? – dmckee