2013-09-05 19 views
10

単語を何回入力して何回入力したかを数えるためにループを使用していますが、何回入力しても動作しますが、アルファベット順にソートされています。最後の単語が出力される前に、イテレータは参照不可能ではないというエラーが出力されます。ここでループのための私のコードは次のとおりです。forループ内で逆参照できないベクトルイテレータ

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

答えて

16

あなたのコードは未定義の動作をしている -

*(it+1)に、あなたは間接参照v.end()しようとしている、itvの最後の要素を指している

if (*it != *(it+1) 
を想像STLのイテレータendは最後の要素を指しません。 end()は、コンテナ内の要素の終わりを表すイテレータを返します。最後は、最後の要素の後ろの位置 です。このようなイテレータは、という最後のイテレータとも呼ばれます。

このように、()開始と終了()を見て、あなたが達成しようとしている何のための最初の要素を含んでいるハーフオープン範囲を定義しますが、除外最後

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

itが終わり近くにあるときstd::adjacent_find

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

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

で、it+1は終わりですので、あなたはで間接参照しようオペレータ。

1

あなたは最後の言葉であり、実行しようとすると:

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

it+1が有効なイテレータですが、derefernceableされていない、v.end()で指しています。したがって、エラー。

1

最後のイテレータの前にある場合は、*(it+1)という問題があります。これは無効なエンドイテレータを逆参照しようとします。

あなたのロジックをこの場合にしたいとは思っていませんが、あなたのものを行う前にif (it+1 != v.end())でこれを確認できます。 it == v.end() - 1

1

は、あなたが(it+1)そうv.end()、 欽慕と敬意v.end()は未定義の動作です。

関連する問題