Je reçois un avertissement suivant toujours pour le type suivant de code.
``
Je comprends que les retours
, je voulais juste savoir est-ce sûr d'ignorer cet avertissement ou devrais-je faire toute ma boucle variable de type``
Je reçois un avertissement suivant toujours pour le type suivant de code.
``
Je comprends que les retours
, je voulais juste savoir est-ce sûr d'ignorer cet avertissement ou devrais-je faire toute ma boucle variable de type``
Si vous pourriez avoir besoin de détenir plus d' INT_MAX
d'éléments dans votre vecteur, utilisez size_t
. Dans la plupart des cas, il n'a pas vraiment d'importance, mais j' size_t
juste pour faire la mise en garde de s'en aller.
Mieux encore, utiliser des itérateurs:
for( auto it = v.begin(); it != v.end(); ++it )
(Si votre compilateur ne supporte pas C++11, utilisez std::vector<whatever>::iterator
à la place de auto
)
C++11 a également fait le choix du meilleur type d'index plus facile (dans le cas où vous utilisez l'index dans le calcul, non seulement pour subscripting v
):
for( decltype(v.size()) i = 0; i < v.size(); ++i )
Qu'est - size_t
?size_t
correspond à l'intégrale type de données renvoyé par la langue de l'opérateur sizeof
et est définie dans le fichier d'en-tête (entre autres) comme un unsigned integral type
.
Est-il acceptable de jeter size_t
de int
?
Vous pouvez utiliser un cast si vous êtes sûr que la taille n'est jamais va être > que INT_MAX
.
Si vous essayez d'écrire un code portable, c'est pas sûr car,
size_t
en 64 bit Unix
est 64 bits
size_t
en 64 bit Windows
est 32 bits
Donc, si vous portez votre code d'Unix vers WIndows, et si au-dessus sont les enviornments vous risquez de perdre des données.
Proposition De Réponse
Compte tenu de la mise en garde, la suggestion est de faire de la i
de unsigned integral type
ou encore mieux de l'utiliser comme type size_t
.
est-ce sûr d'ignorer cet avertissement ou dois-je faire tous mes variable de boucle de type size_t
Pas de. Vous êtes vous-même ouverture à une classe de débordement d'entier attaques. Si le vecteur de taille est supérieure à
MAX_INT
(et un attaquant a une façon de faire qui se produisent), la boucle s'exécute indéfiniment, provoquant un déni de service possible.Techniquement,
std::vector::size
retoursstd::vector::size_type
, cependant.Vous devez utiliser le droit de ce paramètre pour votre compteur de boucle variables. (Vraiment, pour la plupart des utilisations, vous voulez des entiers non signés, plutôt que des nombres entiers signés pour les boucles de toute façon)
Voici une autre vue de Bjarne Stroustrup: http://www.stroustrup.com/bs_faq2.html#simple-program
for (int i = 0; i<v.size(); ++i) cout << v[i] << '\n';
Oui, je sais que je déclare que j'ai à être un vecteur::size_type plutôt que de plaine int de calme mises en garde de certains hyper-suspect les compilateurs, mais dans ce cas,je pense que trop pédant et distrayant.
C'est un compromis. Si vous êtes inquiet que v. size() pourrait aller au-dessus de 2 147 483 647, utilisez size_t. Si vous utilisez j'ai à l'intérieur de votre boucle pour plus que juste la recherche à l'intérieur du vecteur, et vous êtes préoccupé par ce subtil signé/non signé des bogues, utilisation int. Dans mon expérience, cette dernière question est plus répandu que l'ancien. Votre expérience peut différer.
Voir aussi Pourquoi est size_t non signé?.
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.