Question

Y at-il une raison pour laquelle le passage d'une référence à un std::map const provoque le [] opérateur de casser? Je reçois cette erreur du compilateur (gcc 4.2) lorsque j'utilise const:

  

Erreur: aucune correspondance pour « opérateur [] » en   « Carte [nom] »

Voici le prototype de fonction:

void func(const char ch, std::string &str, const std::map<std::string, std::string> &map);

Et, je dois dire qu'il n'y a pas de problème lorsque je retire le mot-clé const devant std::map.

Si j'ai rappelé correctement, le [] opérateur fait insérer une nouvelle paire dans la carte si elle ne trouve pas la clé, ce qui serait évidemment expliquer pourquoi cela arrive, mais je ne peux pas imaginer que ce serait jamais un comportement acceptable.

S'il y a une meilleure méthode, comme l'utilisation de trouver au lieu de [], je vous en serais reconnaissant. Je ne peux pas sembler se trouver à travailler soit si ... Je reçois const erreurs de iterator ne correspondent pas.

Était-ce utile?

La solution

Oui, vous ne pouvez pas utiliser operator[]. Utilisez find, mais notez qu'il retourne const_iterator au lieu de iterator:

std::map<std::string, std::string>::const_iterator it;
it = map.find(name);
if(it != map.end()) {
    std::string const& data = it->second;
    // ...
}

Il est comme avec des pointeurs. Vous ne pouvez pas affecter int const* à int*. De même, vous ne pouvez pas affecter const_iterator à iterator.

Autres conseils

Lorsque vous utilisez l'opérateur [], std :: carte cherche des élément avec clé donné. Si elle ne trouve pas, il crée. D'où le problème avec const.

Utilisez de trouver la méthode et vous serez très bien.

Pouvez-vous s'il vous plaît poster un code sur la façon dont vous essayez d'utiliser find ()? La bonne façon serait:

if( map.find(name) != map.end() )
{
   //...
}

Si vous utilisez C ++ 11, std :: :: carte à devrait travailler pour vous.

La raison std :: carte :: operator [] ne fonctionne pas est que dans le cas de la clé que vous cherchez ne pas exister sur la carte, il insère un nouvel élément à l'aide de la clé fournie et renvoyer une référence à (voir le lien pour plus de détails). Ce n'est pas possible sur un const std :: carte.

La Arobase méthode, cependant, lancer une exception si la clé n'existe pas. Cela étant dit, il est probablement une bonne idée de vérifier l'existence de la clé en utilisant le std :: carte :: méthode find avant de tenter d'accéder à l'élément en utilisant la méthode « à ».

Probablement parce qu'il n'y a pas d'opérateur const [] dans std :: carte. opérateur [] ajoutera l'élément que vous cherchez si elle ne trouve pas. Par conséquent, utilisez la méthode find () si vous voulez effectuer une recherche sans la possibilité d'ajouter.

Pour vos "erreurs const iterator ne correspondent pas":

find () a deux surcharges:

      iterator find ( const key_type& x );
const_iterator find ( const key_type& x ) const;

My guess est que vous obtenez cette erreur parce que vous faites quelque chose comme l'attribution d'un itérateur non-const (à gauche) à la suite d'un appel de find() sur une carte const:

iterator<...> myIter /* non-const */ = myConstMap.find(...)

Cela entraînerait une erreur, mais peut-être pas celui que vous voyez.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top