2016-04-20 40 views
7

Sto solo imparando C++ e sto usando C++ accelerato.Perché ha utilizzato "typedef vector <double> :: size_type" invece di utilizzare "int"

In un esempio di vettore, lo scrittore ha utilizzato il seguente codice;

typedef vector<double>::size_type vec_sz; 
vec_sz size = homework.size; 

So typedef vector<double>::size_type vec_sz; è così che lui non ha bisogno di scrivere il prossimo comando come vector<double>::size_type size = homework.size;, ma la mia domanda è: perché non ha solo dichiarare size come un intero, invece?

int size = homework.size; 

È perché stiamo utilizzando un vettore?

In tal caso, ciò significa che i valori restituiti dagli iteratori vettoriali non possono essere memorizzati in variabili regolari?

+1

Ecco una domanda per voi: qual è il tipo dietro 'vector :: size_type'? –

+1

La risposta breve è che lo scrittore poteva e probabilmente avrebbe dovuto usare 'size_t', ma che * non * è lo stesso di' int' (è * di solito * uguale a 'unsigned int' o' unsigned long'; la sua mancanza di uniformità è molto importante e la differenza di dimensioni può anche dipendere da ciò che si sta facendo). La lunga risposta è troppo lunga anche per la casella di risposta effettiva; un libro _good_ C++ spiegherà in effetti quale è l'accordo con 'int' vs' size_t' vs 'container :: size_type' ma suona come il tuo no. – zwol

+1

Il punto è che non sappiamo esattamente quale tipo sia dietro 'std :: vector :: size_type', ma qualunque sia il tipo, vogliamo un modo breve per dichiararlo. È improbabile che sia un 'int' btw. Sappiamo che è un tipo che può contenere numeri abbastanza grandi per indirizzare il numero massimo di elementi in un * vettore *. – Galik

risposta

6

perché non ha appena dichiarato la dimensione come un numero intero?

Poiché intero non è il tipo corretto di memorizzare dimensione del vettore, per due motivi:

  • int è permesso di essere negativo; dimensione di un vettore è non negativo
  • Anche un unsigned int potrebbe non essere abbastanza grande da contenere dimensione massima vettore

int avrebbe funzionato bene per i piccoli vettori, ma per un approccio generale si dovrebbe usare vector<T>::size_type. Si noti che il tipo non è firmato, quindi è necessario fare attenzione quando si esegue l'iterazione per indicizzazione in primo piano.

significa che i valori restituiti dagli iteratori vettoriali non possono essere memorizzati in variabili regolari?

Gli iteratori non sono di tipo vector<T>::size_type, è del tipo di dati separato.

+0

Quindi, in sostanza, stiamo usando size_type perché sarà in grado di contenere una dimensione più grande di un int unsigned? Se sto leggendo la tua risposta correttamente. –

+1

@OlaniyiJinadu Sì, è essenzialmente la cosa. Se usi typedef del vettore, non devi preoccuparti se l'indice si adatta o no. – dasblinkenlight

5

In primo luogo, std::vector::size_type non è int.

tipo intero senza segno (solitamente std::size_t)

E

std::size_t è il tipo intero senza segno del risultato dell'operatore sizeof nonché l'operatore sizeof... e l'operatore alignof (dal C++ 11).

In secondo luogo, da C++ 11 è possibile utilizzare auto specifier per dedurre il tipo automaticamente.

auto size = homework.size(); 

BTW: homework.size sembra strano, si potrebbe dire homework.size().

+0

Sì. Intendevo 'homework.size()'. lol –