web-dev-qa-db-fra.com

L'itérateur de vecteur n'est pas déréférencable dans la boucle

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;
        }
    }
10
TPOT94

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;
}
21
billz

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.

1
Neil Kirk

lorsque it == v.end() - 1, vous respectez (it+1), donc v.end(), et déférence v.end() est un comportement non défini.

1
Jarod42

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.

1
Gorpik

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.

0
hate-engine