0
votes

Comment implémenter l'itérateur en C ++?

J'ai un problème d'utilisation d'itérateur sur le code suivant? Est-ce que quelqu'un sait comment le réparer? XXX

Message d'erreur: Aucune conversion viable de xxx

merci pour votre aide.


1 commentaires

Mis à côté de: Si ce n'est pas un exercice d'apprentissage sur les itérateurs, pour (const std :: string & word: mots) est un meilleur moyen de boucler. Mister2: le corps de la boucle n'a besoin que d'une expression: WordCount_map [* iter] ++;


4 Réponses :


1
votes

En supposant que vous souhaitez utiliser l'élément std :: string code> Elément des mots code> Vecteur que iTer code> actuellement références em> Comme votre index / clé dans WordCount_map CODE>, vous avez simplement besoin de DÉRÉGARATION ITER CODE> avec l'opérateur * code>. De plus, comme il se trouve, votre pendant code> boucle ne modifie pas la variable code> iTER code>; Vous avez probablement besoin d'un contrat d'incrément ( ++ code>) sur celui-ci à la fin de la boucle: xxx pré>

Cependant, plutôt que d'ajouter ++ iter code> comme une ligne séparée dans un pendant code> en boucle, vous pouvez simplement utiliser un pour code> boucle à la place: p>

    for (auto str : words) {
        if (wordcount_map.count(str)) {
            wordcount_map[str] = 1;
        }
        else {
            int value = wordcount_map.at(str);
            wordcount_map[str] = value + 1;
        }
    }


0 commentaires

4
votes

Regardez sur quelle fonction vous appelez:

*iter


0 commentaires

0
votes

L'erreur n'est pas dans la ligne que vous pensez que c'est. Dans la ligne après et pour le reste du code, vous avez oublié de Déréference iTER et vous passez un itérateur où un std :: string est nécessaire. Correction: xxx


0 commentaires

1
votes

Au fur et à mesure que d'autres réponses ont expliqué, vous obtenez l'erreur du compilateur car vous n'êtes pas la déséroférience de l'itérateur d'accéder au std :: string code> Ça fait référence à.

Je veux juste ajouter ça Même avec cette erreur corrigée, votre code dispose toujours d'erreurs de logique: P>

  • Votre boucle n'est pas d'incrémentation de l'itérateur du tout, il fonctionnera donc sans fin si le vecteur code> n'est pas vide. P> li>

  • Votre corps de boucle est mis en oeuvre en arrière. std :: Unordered_map :: comptez () code> renvoie le numéro em> d'éléments correspondant à la clé demandée. Un si code> instruction traite une valeur numérique de 0 sous false code> et toute autre valeur numérique comme true code>. Donc, si compte () code> renvoie > 0 code> indiquant une touche donnée est em> exist, vous êtes Mise à jour em> cet élément avec une valeur de 1, essuyant sa valeur précédente. Et si comptez () code> renvoie 0 code> indiquant une touche donnée pas em> n'existe pas, vous appelez std :: Unorded_map :: at ( ) code> avec cette même clé qui échoue et jette un std :: out_of_range code> exception. p> li> ul>

    La version corrigée ressemblerait à ceci: p> xxx pré>

    Cependant, ce code est inutilement compliqué et inefficace. Il peut être grandement simplifié à ce sujet: P>

    using StringVec = std::vector<std::string>;
    using StringIntMap = std::unordered_map<std::string, int>;
      
    StringIntMap makeWordCounts(const StringVec& words) {
        StringIntMap wordcount_map;
        
        for(const auto &word : words) {
            wordcount_map[word]++;
        }
    
        return wordcount_map;
    }
    


0 commentaires