2009-05-27 16 views
83

C'è una differenza tra size_t e container::size_type?'size_t' vs 'container :: size_type'

Quello che ho capito è size_t è più generico e può essere utilizzato per qualsiasi size_type s.

Ma è container::size_type ottimizzato per tipi specifici di contenitori?

risposta

88

I contenitori standard definiscono size_type come typedef per Allocator::size_type (Allocator è un parametro di template), che per std::allocator<T>::size_type è tipicamente definito come size_t (o un tipo compatibile). Quindi, per il caso standard, sono uguali.

Tuttavia, se si utilizza un allocatore personalizzato, è possibile utilizzare un tipo sottostante diverso. Quindi container::size_type è preferibile per la massima generalità.

+2

Potete chiarire questa risposta? Ho guardato indietro agli standard di draft fin da 'N1804' e non vedo alcuna relazione tra' Allocator :: size_type' e 'size_type'. Una rapida occhiata a libstdC++ non mostra nulla di simile a questo neanche. –

+1

@ShafikYaghmour, Quindi questa risposta è leggermente superata, ma per massimizzare la portabilità penso che il consiglio sia ancora valido: C++ 03 ha specificato "Table 32: size_type: un tipo che può rappresentare la dimensione dell'oggetto più grande nel modello di allocazione. " Al momento, 'size_t' è stata la scommessa sull'implementazione pratica di questi vincoli. Tuttavia, in C++ 11, è ora definito essenzialmente come: 'std :: make_unsigned :: type' di default. Il che, in pratica, sarà probabilmente lo stesso o compatibile con 'size_t'. –

+1

CARE la risposta è errata .... vedere http: // stackoverflow.it/questions/4849678/c-per-loop-size-type-vs-size-t TL: DR: gli allocatori size_type devono essere size_t e in C++ 17 size_type sarà deprecato così com'è. – user3063349

8

Per std::[w]string, std::[w]string::size_type è uguale a std::allocator<T>::size_type, che è uguale al std::size_t. Per altri contenitori, è un tipo di intero senza segno definito dall'implementazione.

A volte è utile avere il tipo esatto, quindi ad esempio si sa dove si trova il tipo (come, ad esempio UINT_MAX) in modo che si possa fare uso di quello. Oppure per i modelli, in cui è necessario passare due tipi identici a modelli di funzione/classe.

Spesso trovo che uso size_t per brevità o iteratori comunque. Nel codice generico, poiché generalmente non si conosce con quale istanza contenitore viene utilizzato il modello e quali dimensioni hanno questi contenitori, sarà necessario utilizzare il typedef Container::size_type se è necessario memorizzare le dimensioni dei contenitori.

32
  • size_t è definito come il tipo utilizzato per le dimensioni di un oggetto ed è dipendente dalla piattaforma .
  • container::size_type è il tipo utilizzato per il numero di elementi nel contenitore ed è dipendente dal contenitore.

Tutti std contenitori usa size_t come size_type, ma ciascun fornitore libreria indipendente sceglie un tipo che ritiene opportuni per il suo contenitore.

Se si guarda , il numero di contenitori Qt size_type dipende dalla versione. In Qt3 era unsigned int e in Qt4 è stato modificato in int.

+1

Trovo un po 'strano avere la dimensione di qualcosa espressa come int. Potremmo mai avere una dimensione negativa per un contenitore? –

+8

@MihaiTodor: non è raro che le persone usino tipi firmati per tutto, suppongo che Qt stia seguendo l'esempio. La ragione è che le operazioni miste (in particolare i confronti) sono tali che molte persone preferiscono evitare l'uso di tipi non firmati per numeri, piuttosto che dover gestire e/o evitare operazioni miste. Solo perché i tipi non firmati non possono esprimere numeri negativi, non significa che * devi * usarli per numeri che non possono essere negativi :-) Confesso di essere sorpreso che sia 'int' piuttosto che' ssize_t', ' int' è una specie di piccolo. –

+0

@Steve Sì, hai un punto. Grazie. –