std :: size_t ou std :: vector :: size_type?

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::size_type 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 utilise std::size_t tant que size_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).