J'essaie de vérifier si une clé donnée est dans une carte et ne peut pas le faire quelque peu:
typedef map<string,string>::iterator mi;
map<string, string> m;
m.insert(make_pair("f","++--"));
pair<mi,mi> p = m.equal_range("f");//I'm not sure if equal_range does what I want
cout << p.first;//I'm getting error here
alors comment imprimer ce qui est en p?
c++
dictionary
stl
Nous ne pouvons rien faire
la source
la source
std::pair<iterator,bool> insert( const value_type& value );
Quel est le bool qu'il renvoie? indique-t-elle si la clé est déjà présente ou non?Réponses:
Utilisation
map::find
la source
map::count
count
renvoie unint
momentfind
renvoie un itérateur entier. Vous enregistrez la construction de l'itérateur :) Évidemment, si vous allez ensuite utiliser la valeur si elle existe, utilisez find et stockez son résultat.count
etfind
sont presque identiques en vitesse lors de l'utilisation de cartes qui nécessitent des clés uniques. (1) Si vous n'avez pas besoin des éléments pour maintenir un ordre spécifique, utilisez std :: unordered_map , qui a des recherches presque constantes et peut être très bénéfique lors du stockage de plus de quelques paires. (2) Si vous souhaitez utiliser la valeur si elle existe, stockez le résultat de :: find et utilisez l'itérateur pour empêcher 2 recherches:auto it = m.find("f"); if (it != m.end()) {/*Use it->second*/}
Pour vérifier s'il existe une clé particulière dans la carte, utilisez la
count
fonction membre de l'une des manières suivantes:La documentation de
map::find
dit: "Une autre fonction membre,,map::count
peut être utilisée pour vérifier simplement si une clé particulière existe."La documentation de
map::count
dit: "Parce que tous les éléments d'un conteneur de carte sont uniques, la fonction ne peut renvoyer que 1 (si l'élément est trouvé) ou zéro (sinon)."Pour récupérer une valeur de la carte via une clé que vous savez exister, utilisez map :: at :
Contrairement à map :: operator [] ,
map::at
ne créera pas de nouvelle clé dans la carte si la clé spécifiée n'existe pas.la source
find
plutôt. L'second
attribut de l'itérateur retourné parfind
peut être utilisé pour récupérer la valeur de la clé. Si vous utilisezcount
alorsat
ou sioperator[]
vous effectuez deux opérations alors que vous n'auriez pu en utiliser qu'une seule.if(m.count(key))
int
àbool
. Bien qu'il existe d'autres compilateurs C ++ qui n'émettent pas d'avertissement similaire, je préfère utiliser une comparaison explicite pour clarifier l'intention et améliorer la lisibilité. Notez que d'autres langages tels que C # interdisent une telle conversion implicite pour éviter la possibilité d'introduire des erreurs de programmation subtiles.C ++ 20 nous permet
std::map::contains
de le faire.la source
Vous pouvez utiliser
.find()
:la source
Si vous souhaitez utiliser une autre API, recherchez go for
m.count(c)>0
la source
Je pense que tu veux
map::find
. Sim.find("f")
est égal àm.end()
, la clé est introuvable. Sinon, find renvoie un itérateur pointant sur l'élément trouvé.L'erreur est due au fait qu'il
p.first
s'agit d'un itérateur, qui ne fonctionne pas pour l'insertion de flux. Modifiez votre dernière ligne encout << (p.first)->first;
.p
est une paire d'itérateurs,p.first
est un itérateur,p.first->first
est la chaîne de clé.Une carte ne peut avoir qu'un seul élément pour une clé donnée, elle
equal_range
n'est donc pas très utile. Il est défini pour la carte, car il est défini pour tous les conteneurs associatifs, mais il est beaucoup plus intéressant pour le multimap.la source
C++17
simplifié un peu plus avec unIf statement with initializer
. De cette façon, vous pouvez avoir votre gâteau et le manger aussi.la source
la clé de contrôle existe ou non, et le nombre de retours se produit (0/1 sur la carte):
vérifier que la clé existe ou non, et retourner l'itérateur:
dans votre question, l'erreur causée par une mauvaise
operator<<
surcharge, carp.first
estmap<string, string>
, vous ne pouvez pas l' imprimer. essaye ça:la source
cout
peut signifier quelque chose de très différent decount
Bien sûr, si vous vouliez devenir plus amateur, vous pouvez toujours créer un modèle pour une fonction qui a également pris une fonction trouvée et une fonction non trouvée, quelque chose comme ceci:
Et utilisez-le comme ceci:
L'inconvénient est de trouver un bon nom, "find_and_execute" est maladroit et je ne peux rien trouver de mieux du haut de ma tête ...
la source
Soyez prudent en comparant le résultat de la recherche avec la fin comme pour la carte 'm' comme toutes les réponses l'ont fait ci-dessus map :: iterator i = m.find ("f");
vous ne devez pas essayer d'effectuer une opération telle que l'impression de la clé ou de la valeur avec l'itérateur i si son égal à m.end () sinon cela entraînera un défaut de segmentation.
la source
En comparant le code de std :: map :: find et std :: map :: count, je dirais que le premier peut donner un avantage en termes de performances:
la source
Je sais que cette question a déjà de bonnes réponses, mais je pense que ma solution mérite d'être partagée.
Il fonctionne pour les deux
std::map
etstd::vector<std::pair<T, U>>
est disponible à partir de C ++ 11.la source
Si vous souhaitez comparer une paire de cartes, vous pouvez utiliser cette méthode:
C'est une technique utile.
la source
la source