2010-08-23 34 views
19

Salut, j'ai un programme qui traite beaucoup avec des vecteurs et des indices des éléments de ces vecteurs, et je me demandais:C++ uint, unsigned int, int

  1. est-il une différence entre uint et unsigned int
  2. qui est préférable d'utiliser l'un des types ci-dessus ou simplement utiliser int comme je l'ai lu certaines personnes disent que le compilateur gère les valeurs int plus efficacement, mais si j'ai utilisé int je vais devoir vérifier toujours pour les idx négatifs qui est la douleur.
  3. pensez-vous que les itérateurs soient meilleurs? est-il plus efficace que l'indexation normale vectorx[idx]?

p.s le logiciel se chargera de grands processus de données et de bonnes performances est un must have exigence

Répondre

29
  1. C++ définit pas ce type comme uint. Cela doit être "votre" type, c'est-à-dire un type défini dans votre code ou une bibliothèque tierce. On peut deviner que c'est la même chose que unsigned int. Pourrait être unsigned long int si ou quelque chose d'autre. De toute façon, vous devez le vérifier vous-même.

  2. C'est une question de style personnel. Je pense, par exemple, que l'on doit utiliser des types non signés pour représenter des valeurs naturellement non négatives, comme des tailles ou des quantités. Il n'y a pas de différence de performance entre les types signés et non signés, mis à part quelques contextes spécifiques. Je dirais que dans la plupart des cas, ce sont des types non signés qui seront traités plus efficacement.

  3. Les itérateurs rendent les implémentations plus génériques, c'est-à-dire que vous pouvez utiliser un itérateur à accès séquentiel et rendre ainsi votre implémentation applicable à n'importe quelle structure de données séquentielle. En utilisant l'index vous imposez l'exigence d'accès aléatoire sur la structure de données, ce qui est une exigence forte. Ce n'est pas une bonne idée d'imposer des exigences fortes quand il n'y a pas vraiment besoin d'eux.

+1

@AndreyT: Je donne un homme mais j'utilise netbeans, compilateur GCC, et j'ai déjà fait du code avec uint et ça marche sans aucune librairie. Les 2 et 3 points sont très instructifs merci beaucoup :) –

+14

'uint' est typedef'd comme un raccourci à' unsigned int' par la plupart des compilateurs. – You

+2

Dans tous les cas, cela ne change rien au fait qu'il n'y ait pas de type 'uint' ni en C ni en C++, donc à moins d'un compilateur spécifique, la question sur 'uint' n'a pas de réponse significative. – AnT

3

Si vous parcourez le vecteur séquentiellement, utilisez l'itérateur. Il y a un surcoût lié à l'indexation, quel que soit le type d'index, qui peut être évité en itérant.

1

1) uint = unsigned int, en fait uint est juste un typedef pour unsigned int (sera remplacé par unsigned int à la compilation).

2) Si vous voulez ajouter à votre code de la "sécurité" avec uint, vous éviterez à coup sûr des valeurs négatives.

3) Si vous parcourez le vecteur séquentiellement, allez avec les itérateurs, ils sont optimisés pour la boucle séquentielle (ce sont des sortes de pointeurs).

+2

Pas assez mauvais pour un downvote, mais 'uint' sera généralement un' typedef', pas une macro, et signé par rapport à unsigned a peu à voir avec la sécurité (si quelque chose peut causer des bugs de sécurité, car l'arithmétique non signée fonctionne différemment –

+0

Vous avez raison pour typedef (Je vais le modifier) ​​ Par sécurité, je veux dire un sentiment de sécurité pour le programmeur, rien à voir avec le compilateur, c'est pourquoi j'ai mis le "" – Arslan

0

Comme autre affiche ont noté, uint est probablement un typedef pour unsigned int Si vous utilisez Visual Studio, vous pouvez vérifier ce fait très rapidement en appuyant sur F12 lorsque le curseur de texte est en uint pour voir sa définition .