vector<int>::size_type
è un tipo che è garantito per contenere le dimensioni del più grande vector
si può avere, e quindi è garantito per farvi indice di tutti gli elementi del vector
(dal momento che gli indici vanno da 0 a size-1); è il tipo utilizzato per indici e dimensioni in tutti i metodi vector
.
Se si dispone di molto grandi array questo può essere effettivamente rilevanti, in quanto altri tipi interi possono straripare (e se sono signed
tipi cose possono diventare piuttosto strano); anche se non arriverete mai ad array così grandi che questo possa avere importanza, è fondamentalmente una cosa che riguarda la pulizia del codice; inoltre, il tuo ha lo stesso tipo di ivec.size()
, quindi non ricevi avvisi per confrontare interi con segno e senza segno.
Sfondo: vector<T>::size_type
è di solito un typedef
per size_t
(ho letto da qualche parte che in realtà lo standard implicitamente impone che sia size_t
- EDIT: non è implicita a tutti, si veda la risposta @Nawaz s'), che a sua volta è il tipo di ritorno dell'operatore sizeof
. Questo implicitamente dice che può contenere la dimensione per l'oggetto più grande utilizzabile in un'applicazione C++, quindi è sicuramente (solo) abbastanza grande da indicizzare array di qualsiasi tipo.
In realtà, io uso size_t
(definito in <cstddef>
) come indice anche per gli array in stile C, e penso che sia una buona pratica per esattamente le stesse ragioni.
Tra l'altro, si può anche dimenticare del tipo utilizzato per gli indici del tutto e basta andare con iteratori:
for (vector<int>::iterator it = ivec.begin(); it != ivec.end(); ++it)
*it = 0;
o con iteratori + <algorithm>
:
std::fill(ivec.begin(), ivec.end(), 0);
Queste due opzioni funziona qualsiasi contenitore ivec
, quindi non è necessario modificare nulla nel codice se si decide di cambiare il tipo di contenitore.
Con vector
è anche possibile utilizzare il metodo assign
(come suggerito in qualche altra risposta): dice
ivec.assign(ivec.size(), 0);
e quando il riferimento indica che il dimension_type di allocatore deve essere size_t e dopo C++ 14 se la dimensione() si adatta a size_t, allora il programma è mal formato, che perché al mondo abbiamo bisogno sia di size_t che di size_type? Forse qualche confusione inutile? (sappiamo che piace a C++) – user3063349