Comment dois-je traiter avec “signé/non signé” incompatibilité de mises en garde (C4018)?

Je travaille avec beaucoup de code de calcul écrit en C++ avec la haute performance et faible surcharge de la mémoire à l'esprit. Il utilise des conteneurs STL (surtout vector) beaucoup, et parcourt que les conteneurs presque dans chaque fonction.

L'itération du code ressemble à ceci:

for (int i = 0; i < things.size(); ++i)
{
    //...
}

mais il produit de la signé/non signé incompatibilité avertissement (C4018 dans Visual Studio).

Remplacement int avec certains unsigned type est un problème parce que nous avons souvent l'utilisation d'OpenMP pragmas, et il faut le compteur à int.

Je suis sur le point de supprimer les (centaines de) mises en garde, mais j'ai peur, j'ai perdu un peu de solution élégante à ce problème.

Sur les itérateurs. Je pense que les itérateurs sont grands lorsqu'il est appliqué dans les endroits appropriés. Le code que j'ai travaille avec la volonté de jamais changer d'accès aléatoire de conteneurs dans les list ou quelque chose (donc itération avec int i est déjà conteneur agnostique), et toujours besoin de l'index en cours. Et le code que vous avez besoin de type (itérateur lui-même et l'index) juste complique les choses et dissimule la simplicité du code sous-jacent.

InformationsquelleAutor Andrew T | 2011-04-19