2013-09-05 16 views
10

Sto usando un ciclo per contare quante volte è stata inserita una parola, quindi stampo la parola e quante volte è stata inserita, che funziona ma non stampa mai l'ultima parola, ho è ordinato in ordine alfabetico. Prima che l'ultima parola venga stampata, si sbaglia fuori dicendo che l'iteratore non è dereferenziabile. Ecco il mio codice per il loop:Vector iteratore non dereferenziabile in per ciclo

comportamento
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; 
     } 
    } 

risposta

16

Il codice ha definito - Immaginiamo it sta indicando l'ultimo elemento della v, allora si sta cercando di risolvere il riferimento v.end() in *(it+1)

if (*it != *(it+1) 

STL iteratore , la fine non punta all'ultimo elemento; end() restituisce un iteratore che rappresenta la fine degli elementi nel contenitore. La fine è la posizione dietro l' l'ultimo elemento. Tale iteratore è anche chiamato iteratore "past-the-end".

Così, begin() e la fine() definire un intervallo semiaperta che include il primo elemento, ma esclude l'ultimo

-------------------------------- 
| | | | | | | | | 
-------------------------------- 
    /\        /\  
begin()       end() 

Per quello che si sta cercando di ottenere, avere uno sguardo a std::adjacent_find

auto it = std::adjacent_find(v.begin(), v.end()); 

if (it != v.end()) 
{ 
    count ++; 
} 
else 
{ 
    cout << *it << " ---- " << count << endl; 
} 
0

Perché quando it è vicina fine, it+1 è alla fine, e si cerca di dereferenziarlo inOperatore.

1

Quando si è al l'ultima parola e tenta di eseguire:

if (*it == *(it+1))

it+1 sta indicando v.end(), che è un iteratore valido, ma non è derefernceable. Quindi l'errore.

1

Quando è precedente all'iteratore di fine, si presenta un problema qui: *(it+1) poiché questo tentativo di dereferenziare l'iteratore di fine, che non è valido.

Non sono sicuro di cosa si vuole fare la logica in questo caso, ma è possibile verificarlo con if (it+1 != v.end()) prima di fare le proprie cose.

1

quando it == v.end() - 1, si deferenza (it+1) così v.end(), e deferenza v.end() è un comportamento indefinito.

Problemi correlati