2010-08-12 5 views
1

J'ai le C++ suivant la carte par exemple le code:que signifie la carte C++?

map<string,string> &weight2price 
.... 
weight = ... 
price = ... 
if(weight2price.find(weight) == weight2price.end()) 
    weight2price[weight] = price; 

quelqu'un pourrait-il me dire ce que cela signifie par

if(weight2price.find(weight) == weight2price.end()) 
+5

Toujours déconcerté par cela.Vous voyez sûrement comment votre article sera formaté parce que vous devez * défiler devant l'aperçu * pour le soumettre. Je peux à peine dire ce que la partie supérieure du code est censé être. – GManNickG

+0

merci pour cela ~~ – ladyfafa

Répondre

7

Si la clé est passé à find() n'existe pas, find() retours end(). Donc, il dit "Si ça n'a pas été trouvé ...".

Le code pourrait être mieux écrit que:

weight2price.insert(std::make_pair(weight, price)); 

Alors Recherch ne se fait pas deux fois. (Si la clé existe déjà, insert ne fera rien.)

+1

+1: Bon appel - probablement plus rapide, * et * rend l'intention claire. –

1

Cela signifie que weight n'a pas été trouvé. Ensuite, s'il n'a pas été trouvé, il l'ajoute.

+0

Je vois, merci :) – ladyfafa

0

carte en C++ est un hashmap similaire, où une clé (dans votre cas poids) est mappée à une valeur (prix).

Ici, il vérifie pour voir si le poids particulier est déjà mappé sur cette carte, sinon la méthode de recherche retournera weight2price.end()

Dans ce cas, le programme entre dans une paire clé-valeur sur la carte avec la ligne que vous avez grisée.

+5

Ce n'est pas une carte de hachage. – GManNickG

+1

'std :: map' en C++ n'est pas une carte de hachage. C'est * comme * une carte de hachage en ce sens que c'est un système de recherche de clé/valeur, mais il n'y a pas de hachage impliqué; c'est juste un arbre de recherche. – jamesdlin

+0

est-ce la même chose qu'un dictionnaire en python? – ladyfafa

6

La carte STL est un conteneur C++ standard. Il utilise des clés uniques qui peuvent être comparées pour faire référence à des données de valeur stockées dans le conteneur. Cela fonctionne un peu comme un tableau mais contrairement à un tableau, la clé peut être n'importe quoi et n'a pas besoin d'être un nombre entier. La syntaxe d'une carte est:

std::map < Key, Data, Compare, Alloc> 

Key - le type d'objet qui sera utilisé comme clé
données - le type d'objet qui sera utilisé en tant que données
Comparer - une fonction de comparaison pour la clés
Alloc - Le allocateur de la carte, utilisée pour toute la gestion de la mémoire interne

utilisation

:

map[Key] = Data 

Pour lire plus sur les cartes STL regarder ici: http://en.wikipedia.org/wiki/Map_%28C%2B%2B%29 et ici: http://www.sgi.com/tech/stl/Map.html

Dans l'extrait de code, vous utilisez la fonction find() de la carte. Cette fonction renvoie un itérateur pointant vers l'élément de la carte contenant la clé que vous recherchiez. Si cette clé n'est pas trouvée, la fonction de recherche retournera l'itérateur pointant vers la fin de la carte. C'est ce qui est vérifié dans l'extrait de code que vous avez joint à votre question et si la fonction find a renvoyé la valeur de l'itérateur de fin, cela signifie que la clé n'est pas dans la map. Une optimisation pour votre code a été fournie par GMan dans son commentaire.

Une explication très simple pour un itérateur (bien que non complète) serait qu'un itérateur est un pointeur vers une paire < Clé, Données>.

Espérons que cela aide!

+0

est-ce que cela signifie que je pourrais utiliser un dictionnaire en python pour faire les mêmes choses? Je veux dire, est-ce que ces deux fonctionnent essentiellement de la même façon? – ladyfafa

+0

weight2price = {} \t poids = ... \t prix = ... \t si le poids non weight2price.keys(): \t \t weight2price [poids] = prix – ladyfafa

+0

BTW, comment faire cela dans une belle format de code quand je le tape dans le champ de texte ???? – ladyfafa