Question

Je vous écris quelques exemples de code de « Comment penser comme un informaticien en C ++ », et celui-ci est sur la gestion des objets de type de cartes à jouer et des ponts. Je suis face à cette situation:

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. Je pensais que je pouvais utiliser size_t et sortir avec elle afin d'éviter des problèmes sur des architectures différentes, comme je l'ai lu, mais je me demande si je retourne i, mais il est plus grand qu'un entier, je vais planter le programme?

[Edité pour être plus précis dans ma question:] Une fois que je commence à utiliser des vecteurs pour les grandes choses que les cartes, je considérais à l'aide unsigned int en raison d'un avertissement de non-concordance du compilateur, mais je me sens de retour d'un unsigned int ou int a quelques problèmes: 1) int ne prendra pas un indice de vecteur suffisamment grand. 2) retour unsigned int ne me laisse pas revenir -1. 3) unsigned int est pas égal à size_t sur toutes les architectures (je fais également la programmation de microcontrôleurs sur un ARM Cortex-M3).

Que dois-je faire si j'ai jamais assez grand vecteur?

Était-ce utile?

La solution

Castings de size_t à int ne sera pas « crash » votre programme, mais il est une mauvaise mauvaise pratique. D'autre part, STL inclut belle find algorithme de ce que vous faites.

Autres conseils

int est 32 bits sur 32/64 bits Windows et Linux. Je vais tronqués si plus de deux au 31. vous pouvez utiliser unsigned int et votre programme sera bien moins stocker plus de 4 éléments G dans le vecteur:)

size_t est typiquement un unsigned int mais vous ne pouvez pas compter sur cela. Si elle est plus grande qu'une int vous ne plantera pas, vous aurez juste déborder dans un certain nombre (probablement négatif).

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

Vous pouvez également revenir std::pair<size_t, bool>, semblable à std::map insert(). Deuxième moyen d'argument modèle de succès ou d'échec.

Si vous ok avec cela, vous pouvez également utiliser

scroll top