2014-11-07 11 views
8

std::vector::reserve(0); legale e cosa farà?è std :: vector :: reserve (0); legale?

+0

Credo che sia legale e probabilmente non fare nulla. –

+0

Possiamo tranquillamente presumere che la dimensione (e, più rilevante, la capacità) ** sarà ** zero o maggiore. –

+0

@ MikeSeymour Sì, volevo dire qualcos'altro ma è venuto fuori sbagliato. Ho appena rimosso quella parte. : P – NPS

risposta

20

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à]

+1

Presumo che stiate citando lo standard C++ qui? Penso che dovresti dirlo esplicitamente e fornire la versione dello standard quotata. – NPS

+1

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

+0

@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. –

2

È legale e non riserva spazio. Anche se la chiamata è inferiore alla sua capacità, la chiamata non farà nulla.

+2

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. –

+2

Hai un refuso: "then" invece di "than". Volevo aggiustarlo da solo ma dice che la modifica deve essere lunga almeno 6 caratteri ... Idiocy ... – NPS

6

Sì, è un divieto legale.

Se new_cap è superiore alla corrente capacity(), 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.

1

Il documentation fornisce una chiara risposta a questo:

aumentare la capacità del contenitore ad un valore che è maggiore o uguale a new_cap. Se new_cap è maggiore dell'attuale capacity(), 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.

+5

Attenzione: nessun sito wiki è "_la_ documentazione" –

1
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.

2

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.

0

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.

Problemi correlati