std::vector::reserve(0);
legale e cosa farà?è std :: vector :: reserve (0); legale?
risposta
Non c'è niente da vietarlo. L'effetto di reserve
è:
Dopo riserva(), capacità() è maggiore o uguale all'argomento di riserva se riallocazione accade; e uguale al precedente valore di capacità() altrimenti. La riallocazione avviene a questo punto se e solo se la capacità attuale è inferiore all'argomento di reserve().
Poiché il valore del capacity()
può mai essere inferiore a 0 (è senza segno), questo può non avere alcun effetto; non può mai causare una riallocazione.
1. C++ standard [vettore.capacità]
Presumo che stiate citando lo standard C++ qui? Penso che dovresti dirlo esplicitamente e fornire la versione dello standard quotata. – NPS
Ok, ma penso ancora che dovresti dichiarare esplicitamente che stai citando lo standard C++ per gli altri utenti che incontrano la tua risposta più tardi. – NPS
@NPS: Penso che la maggior parte delle persone a cui probabilmente interessa riconoscerebbe il riferimento a '[vector.capacity]', ma rendere il riferimento un po 'più completo chiaramente non fa male quindi ho modificato. –
È legale e non riserva spazio. Anche se la chiamata è inferiore alla sua capacità, la chiamata non farà nulla.
Se l'argomento di 'reserve' è minore di _or_ uguale alla capacità corrente,' reserve' è un no-op. Dal momento che la capacità non può essere negativa, non c'è modo che '0' sia strettamente maggiore. –
Hai un refuso: "then" invece di "than". Volevo aggiustarlo da solo ma dice che la modifica deve essere lunga almeno 6 caratteri ... Idiocy ... – NPS
Sì, è un divieto legale.
Se
new_cap
è superiore alla correntecapacity()
, nuovo storage è allocata, altrimenti il metodo non fa nulla.
(Source, corsivo mio.)
Da capacity()
sarà sempre> = 0 (a causa size_type
essere firmato), passando uno zero è garantito per fare nulla.
Il documentation fornisce una chiara risposta a questo:
aumentare la capacità del contenitore ad un valore che è maggiore o uguale a
new_cap
. Senew_cap
è maggiore dell'attualecapacity()
, viene allocata una nuova memoria, altrimenti il metodo non esegue nulla.
capacity()
restituisce un valore che non può essere negativo. Quindi, passare a zero per new_cap
rientra sempre nella seconda categoria, ad esempio quando la funzione non fa nulla.
Attenzione: nessun sito wiki è "_la_ documentazione" –
void reserve (size_type n);
Se n è maggiore della capacità vettore corrente, la funzione provoca il contenitore assegnare il suo stoccaggio aumentando la sua capacità di n (o superiore).
In tutti gli altri casi, la chiamata di funzione non provoca una riallocazione e la capacità vettoriale non è influenzata.
Secondo il C++ standard
Dopo riserva(), capacità() è maggiore o uguale all'argomento di riserva se riallocazione accade; e uguale al valore precedente della capacità () altrimenti. La riallocazione avviene a questo punto se e solo se la capacità corrente è inferiore all'argomento di reserve().
Quindi semplicemente non sarà una ridistribuzione se l'argomento di riserva è uguale a 0.
La funzione stessa genera un'eccezione solo in un caso
Genera: length_error se n> max_size().
Prendere in considerazione che reserve(0)
non è equivalente a resize(0)
. Nell'ultimo caso verranno rimossi tutti gli elementi del vettore.
Prima di tutto, dovresti provare a capire come funziona Vector. È un array che riserva la memoria per poterlo utilizzare quando è necessario memorizzare un nuovo valore cercando di eseguire l'operazione di inserimento più veloce ed efficiente.
Con std::vector::reserve()
è possibile determinare la quantità di memoria che si desidera prenotare, nel tuo caso, zero.
Nel caso in cui si desideri aggiungere un altro valore al proprio vettore e lo spazio di riserva è zero, funzionerà senza alcun problema, ma l'operazione sarà più lenta. Potrebbe essere un problema se vuoi farlo per molti valori, ma probabilmente non lo noterai se lo fai solo poche volte.
- 1. È meglio chiamare vector :: reserve() prima di chiamare vector :: assign()?
- 2. Sta entrando nel puntatore raw dopo std :: vector :: reserve safe?
- 3. Esiste un equivalente di vector :: reserve() per un elenco std ::?
- 4. std :: vector reserve() e push_back() è più veloce di resize() e indice di array, perché?
- 5. std :: vector: vec.data() o & vec [0]
- 6. Pre-allocazione della memoria in MATLAB à la std :: vector :: reserve (n)
- 7. Può std :: vector essere = 'd in un altro std :: vector?
- 8. std :: vector vs normal array
- 9. E & vec [0] comportamento definito per un vd std :: vector?
- 10. Una chiamata a std :: vector :: clear() imposta std :: vector :: capacity() su zero?
- 11. Inizializzazione Eigen :: vector con std :: vector
- 12. std :: vector :: inserire riserva per definizione?
- 13. std :: vector di std :: vettori contiguità
- 14. std :: vector or boost :: vector thread safe?
- 15. std :: vector <std::string> crash
- 16. C++: std :: vector :: riserva non riservando quando contiene puntatori
- 17. È std :: vector :: data() preservato spostandosi?
- 18. Ereditato da std :: vector
- 19. sizeof() std :: vector (C++)
- 20. Eigen e std :: vector
- 21. std :: vector di riferimenti
- 22. std :: vector :: penalizzazione delle prestazioni di riserva
- 23. efficiente passaggio di std :: vector
- 24. È std :: vector :: begin() da priorC++ 11 equivalente a std :: vector :: data() in C++ 11?
- 25. C++ std :: coppia, std :: vector e memcopy
- 26. std :: vector più veloce di std :: unordered_set?
- 27. std :: vector :: emplace_back e std :: move
- 28. di riserva() di memoria multi-dimensionale std :: vector (C++)
- 29. Ricerca binaria in std :: vector
- 30. std :: list vs std :: vector iteration
Credo che sia legale e probabilmente non fare nulla. –
Possiamo tranquillamente presumere che la dimensione (e, più rilevante, la capacità) ** sarà ** zero o maggiore. –
@ MikeSeymour Sì, volevo dire qualcos'altro ma è venuto fuori sbagliato. Ho appena rimosso quella parte. : P – NPS