J'utilise une boucle pour compter combien de fois un mot a été entré, puis imprimer le mot et combien de fois il a été entré, ce qui fonctionne, mais il n'imprime jamais le dernier mot, je l'ai trié par ordre alphabétique. Avant que le dernier mot ne soit imprimé, il se trompe en disant que l'itérateur n'est pas déréférencable. Voici mon code pour la boucle:
for (vector<string>::iterator it = v.begin() ; it != v.end(); ++it)
{
if (*it == *(it+1))
{
count++;
}
else if (*it != *(it+1))
{
count++;
cout << *it << " ---- " << count << endl;
count=0;
}
}
Votre code a un comportement indéfini - imaginez que it
pointe vers le dernier élément de v
, alors vous essayez de déréférencer v.end()
dans *(it+1)
if (*it != *(it+1)
Itérateur STL, la fin ne pointe pas vers le dernier élément; end () renvoie un itérateur représentant la fin des éléments du conteneur. La fin est la position derrière le dernier élément. Un tel itérateur est également appelé un itérateur final.
Ainsi, begin () et end () définissent une plage semi-ouverte qui inclut le premier élément mais exclut le dernier
--------------------------------
| | | | | | | | |
--------------------------------
/\ /\
begin() end()
Pour ce que vous essayez d’atteindre, jetez un oeil à std :: adjacent_find
auto it = std::adjacent_find(v.begin(), v.end());
if (it != v.end())
{
count ++;
}
else
{
cout << *it << " ---- " << count << endl;
}
Quand c'est un avant l'itérateur de fin, vous avez un problème ici: *(it+1)
car ceci essaie de déréférencer l'itérateur de fin, qui n'est pas valide.
Je ne suis pas sûr de ce que vous voulez que votre logique fasse dans ce cas, mais vous pouvez vérifier cela avec if (it+1 != v.end())
avant de faire votre travail.
lorsque it == v.end() - 1
, vous respectez (it+1)
, donc v.end()
, et déférence v.end()
est un comportement non défini.
Lorsque vous êtes au dernier mot et essayez d’exécuter:
if (*it == *(it+1))
it+1
pointe sur v.end()
, qui est un itérateur valide, mais qui n'est pas derefernceable. D'où l'erreur.
Parce que lorsque it
est proche de la fin, it+1
est terminé et que vous essayez de la déréférencer dans l'opérateur if
.