"size_t" vs "container :: size_type"


108

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:


108

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


2
Puoi chiarire questa risposta? Ho guardato indietro alle bozze di standard fin da N1804e non vedo alcuna relazione tra Allocator::size_typee size_type. Una rapida occhiata a libstdc ++ non mostra nulla di simile a questo.
Shafik Yaghmour

1
@ShafikYaghmour, Quindi questa risposta è leggermente obsoleta, ma per massimizzare la portabilità penso che il consiglio sia ancora valido: C ++ 03 specificato "Tabella 32: size_type: un tipo che può rappresentare la dimensione dell'oggetto più grande nel modello di allocazione." A quel tempo, 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.
Evan Teran

2
ATTENZIONE la risposta non è corretta .... vedi stackoverflow.com/questions/4849678/… TL: DR: gli allocatori size_type devono essere size_t e in C ++ 17 size_type sarà deprecato così com'è.
user3063349

1
@ user3063349 Non vedo nulla in quella pagina, né nello standard C ++ 2017 (23.10.8), per suggerire una size_typedeprecazione. Cosa succede?
Marc 2377

42
  • 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 , scoprirai che il size_typecontenuto dei contenitori Qt dipende dalla versione. In Qt3 era unsigned inte in Qt4 è stato cambiato in int.


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

10
@MihaiTodor: non è insolito che le persone usino caratteri con segno per tutto, immagino che Qt stia seguendo l'esempio. Il motivo è che le operazioni miste (in particolare i confronti) sono un'area così disastrata che molte persone preferirebbero evitare di utilizzare tipi non firmati per i numeri, piuttosto che dover affrontare e / o evitare operazioni miste. Solo perché i tipi non firmati non possono esprimere i numeri negativi, non significa che dovete usarli per i numeri che non possono essere negativa :-) Confesso che mi sorprende è intpiuttosto che ssize_t, intè una specie di piccolo.
Steve Jessop

2
"Tutti i contenitori std usano size_t come size_type" molto molto falso e fuorviante. Sì, di solito lo fanno (almeno tutti i miei compilatori lo hanno fatto in questo modo) ma il riferimento al linguaggio C ++ non afferma che deve essere simile per tutti i contenitori stl !! so care
user3063349


8

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.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.