Y a-t-il une différence entre size_tet container::size_type?
Ce que je comprends est size_tplus générique et peut être utilisé pour tout size_typeart.
Mais est-il container::size_typeoptimisé pour certains types de conteneurs?
Y a-t-il une différence entre size_tet container::size_type?
Ce que je comprends est size_tplus générique et peut être utilisé pour tout size_typeart.
Mais est-il container::size_typeoptimisé pour certains types de conteneurs?
Réponses:
Les conteneurs standard se définissent size_typecomme un typedef to Allocator::size_type(Allocator est un paramètre de modèle), qui std::allocator<T>::size_typeest 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_typepréférable pour une généralité maximale.
size_tle 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>::typepar défaut. Ce qui, en pratique, sera probablement le même ou compatible avec size_t.
size_typedépréciation. Ce qui donne?
size_test défini comme le type utilisé pour la taille d'un objet et dépend de la plate - forme .container::size_typeest le type utilisé pour le nombre d'éléments dans le conteneur et dépend du conteneur .Tous les stdconteneurs utilisent size_tcomme 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_typedes conteneurs Qt dépend de la version. Dans Qt3 c'était le cas unsigned intet dans Qt4, il a été changé en int.
intplutôt que ssize_t, intc'est un peu petit.
Car std::[w]string, std::[w]string::size_typeest é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_tpour 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_typetypedef si vous devez stocker la taille des conteneurs.
N1804et je ne vois aucune relation entreAllocator::size_typeetsize_type. Un rapide coup d'œil à libstdc ++ ne montre rien de semblable non plus.