Y a-t-il une différence entre size_t
et container::size_type
?
Ce que je comprends est size_t
plus générique et peut être utilisé pour tout size_type
art.
Mais est-il container::size_type
optimisé pour certains types de conteneurs?
Y a-t-il une différence entre size_t
et container::size_type
?
Ce que je comprends est size_t
plus générique et peut être utilisé pour tout size_type
art.
Mais est-il container::size_type
optimisé pour certains types de conteneurs?
Réponses:
Les conteneurs standard se définissent size_type
comme un typedef to Allocator::size_type
(Allocator est un paramètre de modèle), qui std::allocator<T>::size_type
est généralement défini comme étant size_t
(ou un type compatible). Donc pour le cas standard, ce sont les mêmes.
Cependant, si vous utilisez un allocateur personnalisé, un type sous-jacent différent peut être utilisé. C'est donc container::size_type
préférable pour une généralité maximale.
size_t
le pari était la mise en œuvre pratique de ces contraintes. Cependant, dans C ++ 11, il est maintenant défini essentiellement comme: std::make_unsigned<X::difference_type>::type
par défaut. Ce qui, en pratique, sera probablement le même ou compatible avec size_t
.
size_type
dépréciation. Ce qui donne?
size_t
est défini comme le type utilisé pour la taille d'un objet et dépend de la plate - forme .container::size_type
est le type utilisé pour le nombre d'éléments dans le conteneur et dépend du conteneur .Tous les std
conteneurs utilisent size_t
comme le size_type
, mais chaque fournisseur de bibliothèque indépendant choisit un type qu'il trouve approprié pour son conteneur.
Si vous regardez qt, vous constaterez que le size_type
des conteneurs Qt dépend de la version. Dans Qt3 c'était le cas unsigned int
et dans Qt4, il a été changé en int
.
int
plutôt que ssize_t
, int
c'est un peu petit.
Car std::[w]string
, std::[w]string::size_type
est égal à std::allocator<T>::size_type
, qui est égal à std::size_t
. Pour les autres conteneurs, il s'agit d'un type entier non signé défini par l'implémentation.
Parfois, il est utile d'avoir le type exact, donc par exemple, on sait où le type s'enroule (comme, vers UINT_MAX
) afin de pouvoir l'utiliser. Ou pour les modèles, où vous devez vraiment passer deux types identiques aux modèles de fonction / classe.
Souvent, je trouve que j'utilise size_t
pour la brièveté ou les itérateurs de toute façon. Dans le code générique, puisque vous ne savez généralement pas avec quelle instance de conteneur votre modèle est utilisé et quelle taille ont ces conteneurs, vous devrez utiliser le Container::size_type
typedef si vous devez stocker la taille des conteneurs.
N1804
et je ne vois aucune relation entreAllocator::size_type
etsize_type
. Un rapide coup d'œil à libstdc ++ ne montre rien de semblable non plus.