comment puis-je carte un int à un correspondant de la chaîne en C/C++
J'ai 20 chiffres et je tiens à les associer avec des chaînes. Est-il un moyen plus rapide en plus de l'aide d'un interrupteur cas de déclaration pour atteindre cet objectif.
J'ai besoin de convertir un int à un correspondant de la chaîne et les numéros ne sont pas forcément emballée. Un peu de code dans Qt
pourrait tout aussi bien être utile?
Exemple: La suite de chiffres et les chaînes de caractères sont associés les uns avec les autres,
1: "Request System Info"
2: "Change System Info"
10: "Unkown Error"
Sont les nombres contigus? Si oui, il suffit d'utiliser une matrice/vecteur de chaînes de caractères.
ne le sont pas contigus
Je suppose que "les 20 nombres", c'est à dire ints. Vous auriez besoin d'Unicode pour obtenir plus de chiffres '0'-'9'.
remarque: il n'y a pas une telle chose comme C/C++
... et les réponses sont toutes exclusivement pour le C++. J'ai besoin d'un C-mise en Œuvre et l'été induit en erreur.. 😉
ne le sont pas contigus
Je suppose que "les 20 nombres", c'est à dire ints. Vous auriez besoin d'Unicode pour obtenir plus de chiffres '0'-'9'.
remarque: il n'y a pas une telle chose comme C/C++
... et les réponses sont toutes exclusivement pour le C++. J'ai besoin d'un C-mise en Œuvre et l'été induit en erreur.. 😉
OriginalL'auteur yan bellavance | 2009-12-15
Vous devez vous connecter pour publier un commentaire.
moyen plus simple d'utiliser la carte
Pm100, la norme mandats certains de tri de l'arbre binaire de la structure. La norme interdit explicitement de sauter les tables et la comme. Aussi, lors de l'insertion, vous aurez de meilleures performances si vous utiliser std::map::insert au lieu de std::map::operator[].
Un problème avec l'aide de l'opérateur[] à faire de la recherche est-il va modifier votre carte si l'indice que vous recherchez n'est pas déjà dans la carte.
mon mauvais billy, je vous avoue ne pas avoir lu la norme
OriginalL'auteur pm100
Je recommande std::map<>
Si vous avez un compilateur qui implémente l' initalizer-fonctionnalité de liste de l'ébauche de la norme C++0x, vous combinez votre définition et initialisation de la carte:
std::map<> écailles bien à un grand nombre d'entrées comme std::map<>::find s'exécute en O(log N). Une fois que vous avez la hachage-élément de la carte du projet de C++0x standard, vous pouvez facilement convertir cette std::unordered_map<> ce qui devrait être capable de regarder les choses en O(1) fois.
std::map fait partie de la bibliothèque C++ standard de sorte qu'il sera disponible avec n'importe quel compilateur conforme.
Non, c'est la STL.
k thx je vais essayer.
L'OMI, de l'insert(make_pair) de l'idiome dans cet exemple, est plus difficile à lire qu' @pm100 l'exemple de mymap[clé]=valeur. A strictement parler, l'insert(make_pair) idiome peut-être un peu plus rapide depuis l'utilisation du support de l'opérateur conduit à un constructeur par défaut invocation, mais je me demande si le gain de performances est en vaut la lisibilité des prestations.
OriginalL'auteur R Samuel Klatchko
Qt fournit également son propre carte implémentations - QMap et QHash.
ou
La documentation donne d'autres exemples, mais il est très facile à utiliser.
Heureux d'être de l'aide. 🙂
OriginalL'auteur Rob
Si vous êtes à la recherche de la vitesse, de l'instruction switch sera la plus efficace. La plupart des compilateurs C/C++ le mettre en œuvre comme un arbre binaire, de sorte qu'il est vraiment très rapide.
aussi semble plus simple à mettre en œuvre
J'étais assez sûr un saut de la table aurait été mis en œuvre, mais ne fait que le rendre moins efficace que std::map?
OriginalL'auteur Peter Olsson
Si vos cordes sont connues à la compilation, alors vous pouvez le faire en C:
Ce n'est pas triste, si le nombre de codes d'erreur est faible et connu au moment de la compilation. Bien sûr, pour quelque chose de plus compliqué, ce simple schéma sera pas optimale.
pouvez-vous expliquer plus? Je crois que vous êtes la construction d'une table de tromper les codes et les messages d'erreur, non?
J'avais besoin d'être en mesure de cartographier l'indice i que vous utilisez pour le message directement, c'est à dire que je reçois une variable d'état à partir d'un appel de fonction, et que je veux insérer la définition associée à un message sans avoir besoin de chercher à chaque fois.
J'avais besoin d'être en mesure de cartographier l'indice i que vous utilisez pour le message directement, c'est à dire que je reçois une variable d'état à partir d'un appel de fonction, et que je veux insérer la définition associée à un message sans avoir besoin de chercher à chaque fois ou à l'aide d'une instruction switch, STL carte a bien fonctionné (dont l'esprit lui qu'il est un meany).
OriginalL'auteur Alok Singhal
Si vos nombres et les chaînes de caractères sont constants, une carte ne fonctionnera pas; il a doit être chargé.
Constante des nombres et des chaînes, je vous recommande un tableau de:
Et pour une grande quantité, utiliser un binaire de l'algorithme de recherche; autrement, un linéaire de recherche est à peu près aussi vite (tant que le tableau est trié).
OriginalL'auteur Thomas Matthews
Quelque chose comme: ?
OriginalL'auteur Marsh Ray
Sont les chaînes de caractères connus au moment de la compilation? Si donc la création d'une carte
std::map messages;
messages [] = "valeur";
messages[cle2] = "une autre valeur";
etc
S'ils doivent être lus à partir d'un fichier, quelque chose comme ce
etc
OriginalL'auteur Liz Albin
Si vos numéros sont contigus (ou presque), un simple tableau ou un vecteur de chaînes de caractères fonctionne très bien.
Si il y a de grands écarts entre les nombres, les chances sont que la méthode la plus rapide sera un tableau de
std::pair<int, std::string>
(oustd::pair<int, char *>
). Alors que la plupart des gens pensent automatiquement à un binaire de recherche rapide pour les recherches, dans ce cas, le petit nombre de possibilités à considérer pourraient bien permettre à un linéaire de recherche pour concurrencer de façon très efficace -- en fait, il pourrait bien être le plus rapide choix disponibles. La raison en est simple: quand il va faire plus de comparaisons, il évite des choses comme des divisions, et les comparaisons sur 20 ints va être vite de toute façon.Edit: notez que std::map est probablement pas un très bon choix. std::map utilise normalement un arbre binaire équilibré, ce qui signifie que 20 éléments utilisera 20 nœuds, chaque de ce qui est normalement attribués séparément. Chaque nœud comprennent généralement au moins deux pointeurs en plus d'int vous avez besoin de stocker, de sorte que vous êtes à peu près trois fois la quantité de données que vous stockez -- que tous les ajoute à relativement pauvres de la localité de cache. Étant donné le petit nombre d'éléments impliqués, un cache miss coûtera plus de 20 comparaisons.
OriginalL'auteur Jerry Coffin
std::map
De la lecture à travers votre question, je pense que vous êtes en train de dire que vous n'avez que 20 numéros de la carte (vous avez dit 20 chiffres, ce qui m'a fait penser à de très grands nombres). Si elles sont toutes de taille relativement petite de la gamme, vous pourriez être mieux de simplement en utilisant un tableau. Vous avez besoin d'un tableau de pointeurs de chaîne aussi grand que
largestIndex - smallestIndex + 1
. Ensuite, pour obtenir la chaîne de caractères associée à un certain nombre, vous feriez quelque chose comme:La
statusArray
variable est initialisée avec quelque chose comme:Ce serait plus rapide qu'un
map
, et assez facile à utiliser. Il n'est tout simplement pas approprié, si votre Id varient largement.OriginalL'auteur P Daddy