2009-12-23 6 views
0

Quelle est la différence? Je veux être capable de voir si un élément est dans une HashMap et je viens de découvrir que si je fais h [élément], il retournera l'élément par défaut s'il n'est pas trouvé, et non null. Comment utiliser la méthode find de l'itérateur pour voir si l'élément est présent?Iterator et interactivité constante en C++

Merci

+3

Voici deux questions différentes. –

Répondre

6

En supposant que vous parlez STL et non une bibliothèque 3ème partie ... m[key] ne pas que renvoyer l'objet par défaut si la clé est pas dans la carte. créera un nouvel élément dans la carte avec cette clé et un objet construit par défaut en tant que valeur.

Vous pouvez utiliser ceci:

map<string, int> mymap; 
//add items to it 
map<string, int>::iterator it = mymap.find("key"); 
if (it != myMap.end()) { 
    // 'key' exists; (it->second) is the corresponding int 
} 

Ou si vous n'avez pas besoin d'obtenir l'objet (vous voulez juste savoir si elle existe):

map<string, int> mymap; 
//add items to it 
if (mymap.count("key") == 1) { 
    // 'key' exists 
} 
+0

Merci pour votre correction, Pavel. Je n'ai pas beaucoup utilisé les cartes :) –

+0

(je ne savais pas -> je ne l'ai pas saisi instinctivement pour ne pas l'avoir beaucoup utilisé, je n'ai aucune excuse pour oublier :: itérateur) –

2

Vous utilisez la méthode de recherche pour voir si quelque chose est dans un std :: carte

std::map<std::string, std::string> myMap 
std::map<std::string, std::string>::iterator it = myMap.find("foo"); 
if(it != myMap.end()) { 
    //foo is in the map 
} else { 
    // foo isn't in the map 
} 

A const_iterator est un itérateur qui lors du retour de-référencé une version const de ce qu'il fait à. Dans l'exemple ci-dessus, si it était un const_iterator puis dé-référencement il serait donné une const std::string

1

La principale différence est que const_iterator ne peut être utilisé pour modifier la valeur d'un élément dans la carte.

utilisant find méthode

hash_map <int, int> hm1; 
    hash_map <int, int> :: const_iterator hm1_RcIter = hm1.find(2); 

    if (hm1_RcIter == hm1.end()) 
     cout << "The hash_map hm1 doesn't have an element " 
      << "with a key of 2." << endl; 
    else 
     cout << "The element of hash_map hm1 with a key of 4 is: " 
      << hm1_RcIter -> second << "." << endl; 
1

Comme les autres réponses expliquent , pour un std::map vous pouvez utiliser find.

Pour répondre à la question dans le titre:

Pour itérateurs, const peut se référer à l'itérateur lui-même, ou le contenu, les points de itérateur. Les deux propriétés sont orthogonales. Avec la notation STL vous avez les cas suivants:

  • iterator Le contenu et l'itérateur peuvent être modifiés.
  • const_iterator Contenu est const, l'itérateur peut être modifié
  • const iterator contenu peut être modifié, l'itérateur est const.
  • const const_iterator Le contenu et l'itérateur sont constants.

Il est similaire pour les pointeurs. Là, le const peut également se référer au contenu ou au pointeur lui-même.

0

Les const itéateurs sont nécessaires lorsque vous voulez qu'un itérateur passe à travers un conteneur const. Essayer d'affecter un itérateur modif-const sur un conteneur const retournera une erreur de compilation. C'est parce que l'itérateur non-const pourrait potentiellement modifier le conteneur const.