10

ループを使用して、単語が入力された回数をカウントし、単語と入力された回数を出力しますが、これは機能しますが、最後の単語を出力することはありません。アルファベット順に並べ替えています。最後の単語が出力される前に、イテレータが逆参照可能ではないことを示すエラーが発生します。ループのコードは次のとおりです。

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

5 に答える 5

21

あなたのコードには未定義の動作があります -itの最後の要素を指していると想像してvください。v.end()*(it+1)

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

STL イテレータ、end が最後の要素を指していません。end() は、コンテナ内の要素の終わりを表す反復子を返します。最後は、最後の要素の後ろの位置です。このような反復子は、過去終了反復子とも呼ばれます。

したがって、begin() と end()は、最初の要素を含み、最後の要素を除外する半開きの範囲を定義します。

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

あなたが達成しようとしていることについては、std::adjacent_findを見てください

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

if (it != v.end())
{
  count ++;
}
else
{
   cout << *it << " ---- " << count << endl;
}
于 2013-09-05T12:58:25.307 に答える
1

最後の単語で実行しようとすると、次のようになります。

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

it+1v.end()有効なイテレータですが、参照解除できません。したがって、エラー。

于 2013-09-05T12:58:45.830 に答える
1

終了イテレータの 1 つ前の場合、ここで問題が発生し*(it+1)ます。これは、無効な終了イテレータを逆参照しようとするためです。

この場合、ロジックで何をしたいのかわかりませんが、作業を行うif (it+1 != v.end())前にこれを確認できます。

于 2013-09-05T13:00:13.543 に答える
0

whenitは終わりに近く、終わりにあり、演算子it+1でそれを逆参照しようとしているためです。if

于 2013-09-05T12:58:30.137 に答える