J'ai un problème d'utilisation d'itérateur sur le code suivant?
Est-ce que quelqu'un sait comment le réparer? Message d'erreur:
Aucune conversion viable de p> merci pour votre aide. P> p>
4 Réponses :
En supposant que vous souhaitez utiliser l'élément Cependant, plutôt que d'ajouter 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:
++ 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;
}
}
Regardez sur quelle fonction vous appelez:
*iter
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 code> et vous passez un itérateur où un
std :: string code> est nécessaire. Correction:
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 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 Votre corps de boucle est mis en oeuvre en arrière. La version corrigée ressemblerait à ceci: p> Cependant, ce code est inutilement compliqué et inefficace. Il peut être grandement simplifié à ce sujet: P> std :: string code> Ça fait référence à.
code> n'est pas vide. P>
li>
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>
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;
}
Mis à côté de: Si ce n'est pas un exercice d'apprentissage sur les itérateurs,
pour (const std :: string & word: mots) code> est un meilleur moyen de boucler. Mister2: le corps de la boucle n'a besoin que d'une expression:
WordCount_map [* iter] ++; code>