2013-09-05 17 views
10

Bir sözcüğün kaç kez girildiğini saymak için bir döngü kullanıyorum, sonra sözcüğü yazdırın ve kaç kez girildiğini yazdı, ancak bu hiç bir zaman son kelimeyi basmıyor, alfabetik olarak sıralanmıştır. Son sözcük basılmadan önce, yineleyicinin kabul edilemez olmadığını söyleyen hatalar. İşte döngü benim kodudur:Vektör iterator döngü için dereferencable değil

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

cevap

16

Kodunuz tanımsız olan davranış - o zaman *(it+1)

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

STL yineleyici dereference v.end() çalışıyoruz, itv son elemana işaret hayal , son son öğeye işaret etmez; end(), kapsayıcıdaki öğelerin sonunu temsil eden bir yineleyici döndürür. Son,'un son elemanı olan pozisyonudur. Böyle bir yineleyici, son-son yineleyici olarak da adlandırılır.

Böylece (başlar) ve son() birinci elemanını ama hariç tutulacaklar size ulaşmak için çalışıyoruz ne için son

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

içeren yarı açık aralığı tanımlamak, bir bakın std::adjacent_find

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

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

it yakın uç olduğunda, it+1 sonunda olduğu için, ve en bunu KQUEUEiçinde çalışıyoroperatörü.

1

son kelime altındadır ve yürütmeye çalıştığınızda:

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

it+1 geçerli bir yineleyici, ama derefernceable olmadığı, v.end() işaret edilmektedir. Bu yüzden hata.

1

Son yineleyiciden bir önceyse, buradaki bir sorunla karşılaşırsınız: *(it+1) bu, geçersiz olan son yineleyicinin geçersiz kılınmasına çalışır.

Mantığınızın bu durumda ne yapmasını istediğinizden emin değilim, ancak işlerinizi yapmadan önce bunu if (it+1 != v.end()) ile kontrol edebilirsiniz. it == v.end() - 1

1

, sen (it+1) yüzden v.end(), deferense ve deference v.end() tanımsız davranıştır.