Lorsque je boucle sur un std::vector
(ou chaque conteneur ayant un iterator à access aléatoire), j’utilise une variable entière non signée i
. Si je veux respecter la norme, dois-je utiliser std::size_t
ou le type indiqué par le conteneur lui-même: std::vector::size_type
?
Si j’ai choisi std::size_t
(pour des raisons de lisibilité), puis-je être sûr que chaque implémentation de chaque conteneur dans l’espace de noms std::size_t
utilise std::size_t
tant que size_type
?
Remarque: J’utilise uniquement C ++ 98 (pour des raisons de compatibilité).
Il n’est pas nécessairement vrai que std::vector
est identique à std::size_t
. Ceci est vrai même pour C ++ 11.
Mais personnellement, j’utilise std::size_t
pour un index std::vector
, quel que soit le type.
Vous pouvez toujours utiliser une assertion statique si vous vous sentez particulièrement diligent. De toute évidence, static_assert
est un ajout ultérieur à ce qui est en C ++ 98, mais dans ce standard, vous pouvez utiliser quelque chose comme:
static char wrong_size_1[1 + sizeof(std::size_t) - sizeof(std::vector::size_type)]; static char wrong_size_2[1 - sizeof(std::size_t) + sizeof(std::vector ::size_type)];
ce qui induirait des échecs de compilation si les types de types ne sont pas de la même taille.
puis-je être sûr que chaque implémentation de chaque conteneur dans l’espace de noms
std::size_t
utilisestd::size_t
tant quesize_type
?
Non vous ne pouvez pas. Cependant, en pratique, vous pouvez être std::size_t
que std::size_t
est assez grand pour un vecteur ou tout autre conteneur basé sur un seul tableau car
size_t
peut stocker la taille maximale d’un object théoriquement possible de tout type (y compris un tableau).