C'è una differenza tra size_te container::size_type?
Quello che ho capito è che size_tè più generico e può essere utilizzato per qualsiasi messaggio size_type.
Ma è container::size_typeottimizzato per tipi specifici di contenitori?
C'è una differenza tra size_te container::size_type?
Quello che ho capito è che size_tè più generico e può essere utilizzato per qualsiasi messaggio size_type.
Ma è container::size_typeottimizzato per tipi specifici di contenitori?
Risposte:
I contenitori standard definiscono size_typecome un typedef to Allocator::size_type(Allocator è un parametro template), che per std::allocator<T>::size_typeè tipicamente definito come size_t(o un tipo compatibile). Quindi per il caso standard, sono gli stessi.
Tuttavia, se si utilizza un allocatore personalizzato, è possibile utilizzare un tipo sottostante diverso. Quindi container::size_typeè preferibile per la massima generalità.
size_tla scommessa era l'attuazione pratica di quei vincoli. Tuttavia, in C ++ 11, ora è definito essenzialmente come: std::make_unsigned<X::difference_type>::typeper impostazione predefinita. Che in pratica sarà probabilmente lo stesso o compatibile con size_t.
size_typedeprecazione. Cosa succede?
size_tè definito come il tipo utilizzato per la dimensione 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 i stdcontenitori vengono utilizzati size_tcome size_type, ma ogni fornitore di libreria indipendente sceglie un tipo che ritiene appropriato per il proprio contenitore.
Se guardi qt, scoprirai che il size_typecontenuto dei contenitori Qt dipende dalla versione. In Qt3 era unsigned inte in Qt4 è stato cambiato in int.
intpiuttosto che ssize_t, intè una specie di piccolo.
Perché std::[w]string, std::[w]string::size_typeè uguale a std::allocator<T>::size_type, che è uguale a std::size_t. Per altri contenitori, è un tipo intero senza segno definito dall'implementazione.
A volte è utile avere il tipo esatto, quindi per esempio si sa dove va a finire il tipo (like, to UINT_MAX) in modo da poterlo utilizzare. O per i modelli, dove è veramente necessario passare due tipi identici a modelli di funzione / classe.
Spesso trovo che uso comunque size_tper brevità o iteratori. Nel codice generico, poiché generalmente non sai con quale istanza di contenitore viene utilizzato il tuo modello e quale dimensione hanno questi contenitori, dovrai utilizzare il Container::size_typetypedef se devi memorizzare le dimensioni dei contenitori.
N1804e non vedo alcuna relazione traAllocator::size_typeesize_type. Una rapida occhiata a libstdc ++ non mostra nulla di simile a questo.