2010-12-16 142 views
4

J'écris des exemples de code à partir de «Comment penser comme un informaticien en C++», et celui-ci traite de la manipulation des objets et des jeux de cartes à jouer. Je suis face à cette situation:Comparer avec size_t, return int?

int Card::find(const std::vector<Card>& deck) const { 
    size_t deckSize = deck.size(); 
    for (size_t i=0; i<deckSize; i++) 
     if (equals(*this, deck[i])) return i; 

    return -1; 
} 

Je ne pouvais pas utiliser « .length() » sur un vecteur en C++ dans Visual Studio 2010 comme dans le texte, et avait lieu d'utiliser .Size() qui retourne (Je crois) std :: size_type. J'ai pensé que je pourrais utiliser size_t et m'en sortir pour éviter les problèmes sur différentes architectures, comme je l'ai lu, mais je me demande si je retourne i, mais c'est plus grand qu'un entier, vais-je planter le programme? Une fois que j'ai commencé à utiliser des vecteurs pour des choses plus grandes que des cartes, j'ai envisagé d'utiliser un entier non signé en raison d'un avertissement de discordance de compilateur, mais je pense que renvoyer un int non signé ou un int quelques problèmes: 1) int ne prendra pas un index vectoriel suffisamment grand. 2) renvoyer unsigned int ne me laissera pas revenir -1. 3) unsigned int n'est pas égal à size_t sur toutes les architectures (je fais aussi de la programmation microcontrôleur sur un ARM Cortex-M3). Que dois-je faire si j'ai un vecteur assez grand?

+9

Vous devriez envisager d'obtenir un autre livre de C++. Il y a une liste de [bons livres d'introduction en C++] (http://stackoverflow.com/questions/388242/the-definitive-c++-book-guide-and-list). Je ne suis pas familier avec _Comment penser comme un informaticien en C++ _, mais son premier exemple a un 'void main()' et utilise ''. Cela n'a pas l'air prometteur. –

Répondre

3

La diffusion de size_t vers int ne provoquera pas le blocage de votre programme, mais c'est une mauvaise pratique. D'autre part, STL inclut un bel algorithme find pour ce que vous faites.

+0

Je me méfie de l'utilisation de la STL pour la programmation non-PC puisque j'apprends aussi à écrire pour les microcontrôleurs (en particulier le ARM Cortex-M3). Il semble que la STL a la capacité de gonfler la taille du code si elle n'est pas gérée correctement. – darvelo

+1

Vous pourriez vouloir coller à C pour ce genre de choses alors, bien que beaucoup ici puissent commencer à hurler :) –

0

size_t est généralement un unsigned int mais vous ne pouvez pas compter sur cela. Si c'est plus grand qu'un int vous ne tomberez pas en panne, vous déborderez juste dans un nombre (probablement négatif).

En supposant que vous n'allez pas avoir plusieurs dizaines de milliers de cartes dans un vecteur, je serais heureux de retourner le int.

+2

size_t ne sera probablement pas un int non signé sur les plates-formes 64 bits. –

+0

Exactement. C'est pourquoi vous ne pouvez pas compter sur cela. – Robert

2

int est un bit 32 bits sous Windows et Linux 32/64 bits. je vais être tronqué si plus de deux à la 31e. vous pourriez utiliser int non signé et votre programme se passera bien à moins de stocker plus de 4 éléments G dans le vecteur :)

+0

Merci pour la suggestion. C'est juste que si je veux retourner -1 dans le cas où aucun résultat ne retourne, l'entier non signé ne le traiterait pas. Je vais modifier mon message pour refléter cela. – darvelo

0

Vous pouvez également retourner std::pair<size_t, bool>, similaire à std::map insert(). Le deuxième argument de modèle signifie succès ou échec.

Si vous ok avec cela, vous pouvez également utiliser boost::optional